Проверка препроцессора определена - PullRequest
2 голосов
/ 23 августа 2010

Я могу проверить предопределенное значение, например:

#ifdef SOME_VAR
  // Do something
#elif
  // Do something 2
#endif

Если мне нужно проверить 2 значения вместо 1. Есть ли оператор:

#ifdef SOME_VAR and SOME_VAR2
  // ...
#endif

Или я должен написать:

#ifdef SOME_VAR
   #ifdef SOME_VAR2
      // At least! Do something
   #endif
#endif

Ответы [ 5 ]

6 голосов
/ 23 августа 2010

Стандартный оператор короткого замыкания и (&&) вместе с ключевым словом defined используется в этом случае.

#if defined(SOME_VAR) && defined(SOME_VAR2)
    /* ... */
#endif

Аналогично, обычный оператор not (!) используется для отрицания:

#if defined(SOME_VAR) && !defined(SOME_OTHER_VAR)
    /* ... */
#endif
4 голосов
/ 23 августа 2010

Вы можете использовать оператор defined:

#if defined (SOME_VAR) && defined(SOME_VAR2)

#endif

#ifdef и #ifndef являются просто ярлыками для оператора defined.

2 голосов
/ 23 августа 2010

Вы можете написать:

#if defined(SOME_VAR) && defined(SOME_VAR2)
// ...
#endif
1 голос
/ 23 августа 2010

#if defined(A) && defined(B)

0 голосов
/ 23 августа 2010

Одной из альтернатив является отказ от использования #ifdef и просто использование #if, поскольку «пустые символы» оцениваются как ложные в тесте #if.

Так что вместо этого вы можете просто сделать

#if SOME_VAR && SOME_OTHER_VAR
    // -- things
#endif

Но большой побочный эффект заключается в том, что вам нужно не только определять свои переменные, но и определять их как нечто. Э.Г.

#define SOME_VAR         1
#define SOME_OTHER_VAR   1

Комментирование любого из этих #defines приведет к сбою вышеупомянутого теста #if (поскольку вложенный материал не оценивается; компилятор не будет аварийно завершать работу, не выдает ошибку или что-либо еще).

...