Определение препроцессора, включающее defined(X)
, никогда не будет иметь значение true, но (defined X)
будет. Это происходит в MSVC9; Я не тестировал другие препроцессоры. Простой пример:
#define FEATURE0 1
#define FEATURE1 0
#define FEATURE2 1
#define FEATURE3 (FEATURE0 && !FEATURE1 && (defined(FEATURE2)))
#define FEATURE4 (FEATURE0 && !FEATURE1 && (defined FEATURE2))
#define FEATURE5 (FEATURE0 && !FEATURE1 && (defined (FEATURE2)))
#if FEATURE3
#pragma message("FEATURE3 Enabled")
#elif (FEATURE0 && !FEATURE1 && (defined(FEATURE2)))
#pragma message("FEATURE3 Enabled (Fallback)")
#endif
#if FEATURE4
#pragma message("FEATURE4 Enabled")
#elif (FEATURE0 && !FEATURE1 && (defined FEATURE2))
#pragma message("FEATURE4 Enabled (Fallback)")
#endif
#if FEATURE5
#pragma message("FEATURE5 Enabled")
#elif (FEATURE0 && !FEATURE1 && (defined (FEATURE2)))
#pragma message("FEATURE5 Enabled (Fallback)")
#endif
Выходные данные компилятора:
1> FEATURE3 включен (резерв)
1> FEATURE4 включен
1> FEATURE5 включен
Рабочие случаи: defined (X)
, defined( X )
и defined X
.
Разбитый корпус: defined(X)
Почему defined
оценивается иначе, когда часть определения, как в случаях #if
в примере, по сравнению с прямой оценкой, как в случаях #elif
в примере?