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