#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 попереднього процесора (CPP), еквівалентна операторам if, то іншим галузям на мові C.
тобто, якщо {#define one}, тоді printf ("один оцінює правду"); else printf ("один не визначений"); тож якби не було #define одного оператора, то інша гілка оператора буде виконана.
Код виглядає дивним, оскільки printf не міститься в жодних функціональних блоках.