Роль #ifdef и #ifndef

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

В этом, какова роль #ifdef и #ifndef, и что вывод?

Ответ 1

Текст внутри пары 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

Ответ 2

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

Ответ 3

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

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

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