C:在宏中隐藏if语句的最佳方法

时间:2019-04-04 16:58:13

标签: c macros c-preprocessor

#define中隐藏if语句的最佳做法是什么?

  1. 您可以在定义中使用if
#define MY_MACRO(isTrue) if(isTrue) do()

我的直觉说这是不好的方法。您能否举一个例子,为什么要这样或为什么不这样呢?例如,使用此命令的任何人都可以在宏后面添加else

  1. 您可以使用三元运算符:
#define MY_MACRO(isTrue) (isTrue) ? do() : do_not()
//OR
#define MY_MACRO(isTrue) (isTrue) ? do() : (void)0

我明白了,为什么不好。例如,任何人都可以使用简单的do()

来调用您的函数true || MY_MACRO(?)
  1. 我当前针对此问题的解决方案是do-while-false
#define MY_MACRO(isTrue) do { if(isTrue) do(); } while (false)

这实际上是最好的方法吗?这个宏可能会发生什么不好的事情?

1 个答案:

答案 0 :(得分:1)

对于1,不能这样使用:

if (foo) MY_MACRO(bar);
else something_else();

因为这样可以展开:

if (foo) {
    if (isTrue) {
        do();
    } else {
        something_else();
    }
}

else会(意外地)成为宏内else的{​​{1}}。

当前方法的坏处是无法在需要使用语句的地方使用它(例如,逗号表达式中的if无效),但是由于您将其用于{ {1}},在需要声明的地方将不会使用。

由于它看起来很短,您可以使其像一条语句,只需添加另一对方括号即可解决问题2:

f((MY_MACRO(a), b), c)

您还应该考虑使用do()而不是宏。