Роль #ifdef и #ifndef - PullRequest
       15

Роль #ifdef и #ifndef

88 голосов
/ 19 сентября 2010
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");

В этом какова роль #ifdef и #ifndef и каков результат?

Ответы [ 4 ]

124 голосов
/ 19 сентября 2010

Текст внутри пары ifdef/endif или ifndef/endif будет оставлен или удален препроцессором в зависимости от условий. ifdef означает «если определено следующее», а ifndef означает «если следующее не определено ».

Итак:

#define one 0
#ifdef one
    printf("one is defined ");
#endif
#ifndef one
    printf("one is not defined ");
#endif

эквивалентно:

printf("one is defined ");

, поскольку one определено, поэтому ifdef является истинным, а ifndef - ложным. Неважно, что он определяет как . Подобный (лучше на мой взгляд) кусок кода будет выглядеть так:

#define one 0
#ifdef one
    printf("one is defined ");
#else
    printf("one is not defined ");
#endif

, поскольку это более четко определяет намерение в данной конкретной ситуации.

В вашем конкретном случае текст после ifdef не удаляется, поскольку определено one. Текст после ifndef удаляется по той же причине. В какой-то момент потребуется две закрывающие строки endif, и первая заставит строки снова включиться, как показано ниже:

     #define one 0
+--- #ifdef one
|    printf("one is defined ");     // Everything in here is included.
| +- #ifndef one
| |  printf("one is not defined "); // Everything in here is excluded.
| |  :
| +- #endif
|    :                              // Everything in here is included again.
+--- #endif
61 голосов
/ 19 сентября 2010

Кто-то должен упомянуть, что в вопросе есть небольшая ловушка.#ifdef будет только проверять, был ли следующий символ определен с помощью #define или с помощью командной строки, но его значение (на самом деле его подстановка) не имеет значения.Вы могли бы даже написать

#define one

прекомпиляторы, принимающие это.Но если вы используете #if, это другое дело.

#define one 0
#if one
    printf("one evaluates to a truth ");
#endif
#if !one
    printf("one does not evaluate to truth ");
#endif

даст one does not evaluate to truth.Ключевое слово defined позволяет получить желаемое поведение.

#if defined(one) 

, следовательно, эквивалентно #ifdef

Преимущество конструкции #if состоит в том, чтобы обеспечить лучшую обработку кодапути, попробуйте сделать что-то подобное со старой парой #ifdef / #ifndef.

#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
0 голосов
/ 29 ноября 2018

Код выглядит странно, потому что printf не находится ни в каких функциональных блоках.

0 голосов
/ 02 сентября 2015

«# if one» означает, что если «#define one» было написано, «#if one» выполняется иначе, «#ifndef one» выполняется.

Это всего лишь директива препроцессора C (CPP), эквивалентная операторам if, then, else на языке C.

т.е. if {#define one} then printf («каждый оценивает истину»); еще printf («один не определен»); так что если бы не было оператора #define one, тогда выполнялась бы ветвь else оператора.

...