如何使用#if,#else,#endif ...在c宏中

cam*_*ino 8 c c++ c-preprocessor

 #include < iostream >  

 #define MY_CHK_DEF(flag) \
 #ifdef (flag) \
    std::cout<<#flag<<std::endl; \
 #else \
    std::cout<<#flag<<" ,flag not define"<<std::endl; \
 #endif 


 int main()
 {
    MY_CHK_DEF(FLAG_1);
    MY_CHK_DEF(FLAG_2);
    MY_CHK_DEF(FLAG_3);
    ...  
 }
Run Code Online (Sandbox Code Playgroud)

编者报告:

main.cpp:3:24:错误:'#'后面没有宏参数

有任何想法吗?

谢谢

Ton*_*nyK 8

你不能这样做.#if,#else和#endif必须是逻辑行上的第一个令牌.你的定义只是一条逻辑行,所以它不起作用,


Rom*_*her 6

你必须反过来这样做(为每个#if/#ifdef /#else条件定义宏(如果你嵌套,你必须在每个分支上放置一个定义).你可能应该在每个逻辑分支或它定义它当你试图调整很少调整的标志时,你将无法编译.你可以#define这样的noops.注意注意不要将带有副作用的表达式包装到#define'd宏中,当调试标志打开时,这些宏会减少为noop ,或者您的程序可能无法正常工作.

 #define N(x) 
Run Code Online (Sandbox Code Playgroud)
 #include < iostream > 

 #ifdef (flag) 
 #define MY_CHK_DEF(flag) 
    std::cout<<#flag<<std::endl; 
 #else 
 #define MY_CHK_DEF(flag) \
    std::cout<<#flag<<" ,flag not define"<<std::endl;
 #endif 


 int main()
 {
    MY_CHK_DEF(FLAG_1);
    MY_CHK_DEF(FLAG_2);
    MY_CHK_DEF(FLAG_3);
    ...  
 }
Run Code Online (Sandbox Code Playgroud)