В чем разница между undef и define <MACRO>0? - PullRequest
2 голосов
/ 28 марта 2012

Хотел понять разницу между undef и определить макрос как 0. Спасибо.

Ответы [ 5 ]

7 голосов
/ 28 марта 2012
#define MACRO 0

определяет токен препроцессора MACRO как литерал 0

#undef MACRO

Удаляет определение токена препроцессора MACRO так, как будто его никогда не существовало.

Например:

#define MACRO 0

#if defined ( MACRO )
// we get here
#endif

#if ( MACRO )
// we don't get here
#endif

#undef MACRO

#if defined ( MACRO )
// we don't get here
#endif
3 голосов
/ 28 марта 2012

Макрос, определенный как 0, все еще определен.

#define VAL 0
#ifdef VAL
  // VAL is defined so this part will be entered
  printf("%d", VAL); // <- prints "0"
#endif

#undef VAL
#ifdef VAL
  // Val is now undefined, this part will not be entered
#endif
2 голосов
/ 28 марта 2012

Разница в том, что "undefined" не совпадает с "0" (в зависимости от вашего использования).

Используется в логическом контексте, например, #if MY_MACRO, разницы нет (потому что undefined переведен на false).

Однако, когда вы проверяете, какой макрос определен, есть разница:

// this macro is defined but empty.
// #ifdef MY_MACRO would evaluate to true/be included
// #if MY_MACRO would evaluate to false/not be included
// occurances would be deleted, e.g. 'something = MY_MACRO;' would be changed to 'something = ;'
#define MY_MACRO

// this macro is defined and set to 0.
// #ifdef MY_MACRO would evaluate to true/be included
// #if MY_MACRO would evaluate to false/not be included
// occurances would be replaced, e.g. 'something = MY_MACRO;' would be changed to 'something = 0;'
#define MY_MACRO 0

// this macro is undefined (after these lines)
// #ifdef MY_MACRO would evaluate to false/not be included
// #if MY_MACRO would evaluate to false/not be included
// occurances would remain unchanged (as the macro isn't defined anymore), e.g. 'something = MY_MACRO;' would be kept as 'something = MY_MACRO;'
#define MY_MACRO Hello!
#undef MY_MACRO

В общем: #define всегда присваивает какое-то значение и определяет макрос; даже если новое значение «пусто». #undef всегда удаляет определение макроса, делая его неопределенным; события больше не будут заменены.

1 голос
/ 28 марта 2012

в первом случае символ не будет определен (#ifdef MACRO не будет «входить»), во втором случае MACRO определен как «0»

1 голос
/ 28 марта 2012

Один из них определяет макрос таким образом, что в определенных контекстах вхождения идентификатора макроса будут заменены на 0 препроцессором. Другой удаляет любое определение макроса, так что если идентификатор находится в том же контексте, он ничем не заменяется препроцессором, вместо этого он остается как есть.

Например, препроцессор превращает это:

#define MACRO 0

int main()
{
    return MACRO;
}

в это:

int main()
{
    return 0;
}

Но, это превратит это:

#define MACRO 0
#undef MACRO

int main()
{
    return MACRO;
}

в это:

int main()
{
    return MACRO;
} 

Во втором примере компилятор C встретит идентификатор MACRO и, вероятно, выдаст ошибку, что он не объявлен, и компиляция, скорее всего, не удастся.

...