【问题标题】:MACRO in LHS or RHS of == (!=) operator inside if() condition in C? [closed]C 中 if() 条件中 == (!=) 运算符的 LHS 或 RHS 中的 MACRO? [关闭]
【发布时间】:2018-12-13 21:29:02
【问题描述】:

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

/*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 */
}

这是代码审查员 cmets

根据编码标准,我们应该使用 MACRO 而不是数值 有时我们可能会使用= 而不是==

它得到了解决

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){ }

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

错误:需要左值作为赋值的左操作数

但是这个

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

干脆走开。

建议使用以上两项中的哪一项,甚至更好的技术,并且 C 标准所说的相同,即 MACRO 应在检查中比较运算符的 LHS 或 RHS 侧使用?

【问题讨论】:

  • 如果宏包含变量,则无济于事。
  • yes true @Jean-FrançoisFabre 在我的例子中,宏 DB_RAT_GERAN 是一个整数常量,如 0x01

标签: c if-statement operators preprocessor


【解决方案1】:

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

虽然后者(通常称为“尤达条件”)实际上确实可以防止错误地使用 = 而不是 ==(这正是您提到的代码审查评论所谈论的内容),但是这种风格不是很容易阅读。

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

【讨论】:

  • 例如,当两个术语都是变量时,这并不总是可能的
  • 感谢您的宝贵意见。我同意可读性的观点。
猜你喜欢
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 2017-03-21
  • 1970-01-01
  • 2013-05-04
相关资源
最近更新 更多