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

C: Best way to hide if-statement in macro

#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

到这里我明白了,为什么不好。例如,任何人都可以使用简单的 true || MY_MACRO(?)

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

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

对于1,不能这样用:

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

因为这样会展开:

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

else 将(意外地)成为宏内 ifelse

你目前的方法的缺点是它不能用在需要语句的地方(例如 f((MY_MACRO(a), b), c) 在逗号表达式中不起作用),但是因为你用它来产生副作用do(),它不会用在需要声明的地方。

因为它看起来很短,你可以让它像一个语句,只需添加另一对括号来解决你的问题 2:

#define MY_MACRO(isTrue) ((isTrue) ? do() : (void)0)

您还应该考虑 static conditional_do(bool isTrue) { if (isTrue) { do(); } } 而不是宏。