C拼图{MACRO}

时间:2011-02-10 18:20:48

标签: c macros c-preprocessor

我偶然发现了以下谜题

#include <stdio.h>
int main()
{
    {

        /*Fill in something here to make this code compile  
           ........... 
         */   
        ooOoO+=a;    
    } 
    #undef ooOoO 
    printf("%d",ooOoO); 

    return 0;
}

简而言之,我想问一下ooOoO之后如何在printf中使用#undef

5 个答案:

答案 0 :(得分:11)

您需要将其声明为变量:

#define ooOoO int ooOoO = 42; int a = 1; { ooOoO

宏替换是非递归的;在替换ooOoO时,标识符ooOoO不会被视为宏名称。


如果您正在寻找使用宏的解决方案,那么您可以简单地忽略#undef指令,并且永远不会将ooOoO声明为宏。在C和C ++中允许#undef未定义为宏的标识符。

答案 1 :(得分:6)

重新格式化代码(缩进)并添加解决方案之后,这就是我收到的内容:

#include <stdio.h>
int main()
{
    {
/*-Insert starts here-*/
    }
    int ooOoO = 0, a=3;
    {
/*-Insert ends here-*/
        ooOoO+=a;      
    }       
    #undef ooOoO 
    printf("%d",ooOoO);       
    return 0;
}

编译并打印3

答案 2 :(得分:3)

这个怎么样?

#include <stdio.h>
int main(){
    int ooOoO = 0;
    {
        int a = 3;
        ooOoO+=a;
    }
    #undef ooOoO
    printf("%d",ooOoO);

    return 0;
}

答案 3 :(得分:1)

#include <stdio.h>
int main(){
{

      /*Fill in something here to make this code compile  

*/
}
int a = 0, ooOoO=0;
#define ooOoO ooOoO
{
/*
      */   
              ooOoO+=a;    
          } 
          #undef ooOoO 
          printf("%d",ooOoO); 

return 0;
}

答案 4 :(得分:0)

#undef未定义预处理器的符号,因此它不会被其他东西替换,但是ooOoO仍然会进入编译器。