C:在宏中隐藏 if 语句的最佳方法
C: Best way to hide if-statement in macro
在 #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
到这里我明白了,为什么不好。例如,任何人都可以使用简单的 true || MY_MACRO(?)
调用您的函数 do()
- 我目前针对此问题的解决方案是 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
将(意外地)成为宏内 if
的 else
。
你目前的方法的缺点是它不能用在需要语句的地方(例如 f((MY_MACRO(a), b), c)
在逗号表达式中不起作用),但是因为你用它来产生副作用do()
,它不会用在需要声明的地方。
因为它看起来很短,你可以让它像一个语句,只需添加另一对括号来解决你的问题 2:
#define MY_MACRO(isTrue) ((isTrue) ? do() : (void)0)
您还应该考虑 static conditional_do(bool isTrue) { if (isTrue) { do(); } }
而不是宏。
在 #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
到这里我明白了,为什么不好。例如,任何人都可以使用简单的 true || MY_MACRO(?)
do()
- 我目前针对此问题的解决方案是 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
将(意外地)成为宏内 if
的 else
。
你目前的方法的缺点是它不能用在需要语句的地方(例如 f((MY_MACRO(a), b), c)
在逗号表达式中不起作用),但是因为你用它来产生副作用do()
,它不会用在需要声明的地方。
因为它看起来很短,你可以让它像一个语句,只需添加另一对括号来解决你的问题 2:
#define MY_MACRO(isTrue) ((isTrue) ? do() : (void)0)
您还应该考虑 static conditional_do(bool isTrue) { if (isTrue) { do(); } }
而不是宏。