Роль #ifdef и #ifndef


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

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

Ответы:


131

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

Так:

#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

68

Кто-то должен упомянуть, что в вопросе есть небольшая ловушка. #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

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

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

то есть, если {#define one} then printf ("один оценивается как истина"); else printf ("один не определен"); поэтому, если не было #define one, то будет выполнена ветвь else этого оператора.


4
Я не уверен, что это добавляет, что другие ответы еще не охватывают, и ваш пример не C или C ++.
SirGuy 02

-2

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


1
весь блок может находиться внутри самой функции. И добро пожаловать в stackoverflow. Прочтите stackoverflow.com/help/how-to-answer .
rajashekar
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.