Роль #ifdef та #ifndef


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

У цьому яка роль #ifdefі #ifndef, і який результат?

Відповіді:


131

Текст усередині 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

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 попереднього процесора (CPP), еквівалентна операторам if, то іншим галузям на мові C.

тобто, якщо {#define one}, тоді printf ("один оцінює правду"); else printf ("один не визначений"); тож якби не було #define одного оператора, то інша гілка оператора буде виконана.


4
Я не впевнений, що це додає, що інші відповіді вже не охоплюють, і ваш приклад не є C або C ++.
SirGuy

-2

Код виглядає дивним, оскільки printf не міститься в жодних функціональних блоках.


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