在#define
中隐藏if语句的最佳做法是什么?
if
:#define MY_MACRO(isTrue) if(isTrue) do()
我的直觉说这是不好的方法。您能否举一个例子,为什么要这样或为什么不这样呢?例如,使用此命令的任何人都可以在宏后面添加else
。
#define MY_MACRO(isTrue) (isTrue) ? do() : do_not()
//OR
#define MY_MACRO(isTrue) (isTrue) ? do() : (void)0
我明白了,为什么不好。例如,任何人都可以使用简单的do()
true || MY_MACRO(?)
#define MY_MACRO(isTrue) do { if(isTrue) do(); } while (false)
这实际上是最好的方法吗?这个宏可能会发生什么不好的事情?
答案 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()
而不是宏。