#define M(N)\
#if N == 5\
/*several lines of code that
Can't be replaced with a
tertnary operator*/
#else\
N;\
#endif
当我这样使用这个宏时
M(5);
我希望输出是
// everything within the #if #else block
但是它不编译。
我对它无法编译并不感到惊讶:我知道#if 不能用于续行,即“\”。
我也试过
#define POUND_IF #if
然后使用 POUND_IF 但不起作用。
这可能吗?
是否有一些漂亮的 Boost 预处理器可以使用?
最佳答案
简而言之,你不能。不过,您可以依赖优化器:
#define M(N)\
do { if (N == 5) { \
/*several lines of code that
Can't be replaced with a
ternary operator*/ \
} else { N; } } while (0)
如果编译器可以确定代码运行时N
的值为5(例如你写M(5)
),那么只有代码在if
的主体将包含在生成的代码中。如果编译器可以确定代码运行时N
的值不会是5,那么它只会生成else
子句主体中的代码。如果它无法确定值是什么,预处理器也无法确定,但编译器将包含所有代码。
关于c - 如何使#if#endif 成为宏的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33447326/