正如您所发现的,您无法按照您尝试的方式执行此操作。宏扩展根本没有内联条件评估,因此您必须创建多个宏。
但是,如果您只是尝试“优化”正常代码流,则可以依赖编译器的优化。考虑一下:
if (true) {
std::cout << "Hi\n";
}
生成的程序中不会有任何条件检查,因为true
总是真实的。
相似地:
if (false) {
std::cout << "Hi\n";
}
生成的程序将不包含任何产生输出的代码,因为false
从来都不是真实的。
相似地:
if (4 != 4) {
std::cout << "Hi\n";
}
该程序仍然不包含std::cout
code.
在许多情况下,您可以利用这一事实来保持代码简单并达到您想要的效果:
#define BAR(X) \
if ((X) == 4) {
std::cout << "hi" << std::endl;\
}
当然,这里的限制是if
声明必须在您所写的地方有效BAR(5)
, or BAR(42)
or BAR(999)
.
这也很灵活,因为现在您可以使用运行时值(例如BAR(i)
) 并且,尽管条件不能再在编译时折叠,但在这种情况下,您无论如何也没有理由期待这种情况。
我在我的日志记录宏中采用了这种方法:宏,当需要时LOG_LEVEL_DEBUG
,扩展为在发布版本中静态已知永远不会匹配的条件。
这个想法是让编译器进行优化.
您还需要考虑使用一些宏扩展技巧以避免后续问题else clauses.