#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
- false. Неважно, что он определил. Аналогичный (лучше, на мой взгляд) фрагмент кода:
#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
"# если один" означает, что если "#define one" было записано "#if one" выполнено иначе выполняется "#ifndef one".
Это только директива C Pre-Processor (CPP), эквивалентная операторам if, then else else на языке C.
то есть. if {#define one}, затем printf ( "оценивается по правде" ); еще printf ( "один не определен" ); поэтому, если не было #define одного оператора, тогда будет выполняться ветка else инструкции.