c - 如何使#if#endif 成为宏的一部分

标签 c macros

#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/

相关文章:

c++ - C 和 C++ 类型转换的区别?

从头文件调用函数

macros - 宏可以匹配常量参数而不是文字吗?

c++ - 当我尝试调用此自定义宏时,所有错误都会出现

检查补丁宏错误

c - 指针是 "passed by value"?

C for 和 while 循环随机重复

C 内联汇编标签问题

c - 用二进制值切换大小写值?

macros - 如何禁用未使用的宏警告?