#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
Какова в этом роль #ifdefи #ifndefи каков результат?
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
Какова в этом роль #ifdefи #ifndefи каков результат?
Ответы:
Текст внутри пары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
Кто-то должен упомянуть, что в вопросе есть небольшая ловушка. #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
«#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 этого оператора.
Код выглядит странно, потому что printf не находится ни в каких функциональных блоках.