Загадка C {MACRO} - PullRequest
       18

Загадка C {MACRO}

2 голосов
/ 10 февраля 2011

Я где-то наткнулся на следующую загадку

#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 ed?

Ответы [ 5 ]

11 голосов
/ 10 февраля 2011

Вы должны объявить его как переменную:

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

Макро-замена нерекурсивна; при замене ooOoO идентификатор ooOoO не будет обрабатываться как имя макроса.


Если вы ищете решение, которое не использует макрос, то вы можете просто игнорировать директиву #undef и никогда не объявлять ooOoO как макрос. В C и C ++ допускается #undef идентификатор, который не определен как макрос.

6 голосов
/ 10 февраля 2011

После переформатирования кода (отступа) и добавления решения вот что я получаю:

#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

3 голосов
/ 10 февраля 2011

Как насчет этого?

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

    return 0;
}
1 голос
/ 10 февраля 2011
#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;
}
0 голосов
/ 10 февраля 2011

#undef отменяет определение символа препроцессором, чтобы он не заменялся чем-то другим, но ooOoO все еще попадает в компилятор.

...