c - C中if()条件内==(!=)运算符的LHS或RHS中的MACRO?

标签 c if-statement operators preprocessor

<分区>

这是我在分析大型代码库时的观察结果。这是示例代码

/*comparing received RAT(it may be 2G/3G/4G) Type from ip packet with numeric value */
if(pBearer.data.recv.rat_recv == 1)
{
        rrc.send_conn.rat_type = MY_GERAN; /* setting RAT as GERAN(enumerated value) i.e 2G */
        /* further processing of packet */
}

这是代码审阅者的评论

As per coding standard, we should use MACRO instead of numeric value as some time we may use = instead of ==.

它被解析为

if(pBearer.data.recv.rat_recv == DB_RAT_GERAN) /* DB_RAT_GERAN is a macro defined somewhere in header file */
{
        rrc.send_conn.rat_type = MY_GERAN; /* setting RAT as GERAN i.e 2G */
        /* further processing of packet */
}

这是正确的,因为有时人们可能会错误地使用 =而不是 ==喜欢

if(pBearer.data.recv.rat_recv = 1) { /* always set RAT as 2G */ }

并且编译器不会产生任何警告(好的编译器,可能是,但几乎没有人分析 makebuild 结果直到它崩溃)或相同的错误 & 它会产生问题。

现在我有古玩了,可以像这样使用

if(DB_RAT_GERAN == pBearer.data.recv.rat_recv)

而不是

if(pBearer.data.recv.rat_recv == DB_RAT_GERAN)

我更喜欢在比较运算符的左侧 上使用 MACRO 而不是右侧,因为在最坏的情况下,如果错误地使用 =用于代替 ==如下图

if(DB_RAT_GERAN = pBearer.data.recv.rat_recv){ }

编译器产生一个非常有意义的错误,例如

error: lvalue required as left operand of assignment

但是这个

if(pBearer.data.recv.rat_recv = DB_RAT_GERAN) { }

简单地离开。

建议使用以上两者中的哪一个或更好的技术并做任何事情C标准说的差不多,即 MACRO 应该在检查中的比较运算符的 LHS 或 RHS 端使用?

最佳答案

是否使用类似if (a == 5)if (5 == a) 很大程度上取决于风格。 C 标准没有说明有关条件语句的推荐用法。

虽然后者(通常称为“Yoda 条件”)实际上确实防止错误地使用 = 而不是 == (并且正是代码审查你提到的评论正在谈论),但是这种风格并不容易阅读。

如果您执行前者,现在大多数编译器都会发出警告。特别是,如果您使用 -Wall,gcc 将对此发出警告,而 MSVC 将使用 /W4 发出警告。只要您将警告级别设置得足够高(您总是应该这样做)并将警告视为错误(-Werror 对于 gcc,/WX对于 MSVC)这样的事情不会被遗漏,我建议使用这种风格,既为了可读性,也为了能够捕捉这种情况的工具。

关于c - C中if()条件内==(!=)运算符的LHS或RHS中的MACRO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53770355/

相关文章:

F# 检查算术范围

Java 运营商有趣的问题

c - 在函数中使用 const 修饰符

c - 关于 pthread_create() 和 pthread_join()

c - MPI 星型(中心辐射型)通信器的性能是否优于 MPI_COMM_WORLD?

javascript - 如果图像不可用,则显示文本

javascript - 如何为我的剪刀石头布游戏编写一组更简洁的代码?

c - for 循环仅迭代 scanf 之后写入的 printf 一次

c++ - 在 Visual Studio C++ 中跳过 else 语句?

JavaScript 二元运算符