A preprocessor definition that includes defined(X) will never evaluate to true, but (defined X) will. This happens in MSVC9; I have not tested other preprocessors. A simple example:
#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
Compiler output:
1> FEATURE3 Enabled (Return)
1> FEATURE4 Enabled
1> FEATURE5 Enabled
Working cases: defined (X) , defined( X ) and defined X
Broken Case: defined(X)
Why is defined evaluated differently when a part of the definition, as in the case of #if in the example, is compared with a direct assessment, as in the cases of #elif in the example?
Devin source share