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

时间:2011-05-10 06:47:57

标签: 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);
    ...  
 }

编辑报告:

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

任何想法?

由于

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:6)

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

 #define N(x) 

 #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);
    ...  
 }

答案 2 :(得分:2)

C预处理器是单通道的,而#define创建了一个非常愚蠢的替换,没有进一步处理 - 您的MY_CHK_DEF(标志)宏将#if语句内联插入到由C编译器解释而不是有效C的预处理代码中。

您可以将其改为单遍,或者如果不能,则通过预处理器两次,手动 - 一次通过cpp -P,第二次通过正常的编译过程。

答案 3 :(得分:0)

如果你使用BOOST处理器头库,你实际上可以这样做..它提供了一个BOOST_PP_IF宏允许这种类型的决定。

http://www.boost.org/doc/libs/1_53_0/libs/preprocessor/doc/ref/if.html