包含的预处理程序定义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
Run Code Online (Sandbox Code Playgroud)
编译器的输出是:
1> FEATURE3启用(后退)
1> FEATURE4启用
1> FEATURE5启用
工作情况:defined (X),defined( X ),和defined X.
破案:defined(X)
defined当定义的一部分(如#if示例中的情况)与直接评估相比时,为什么评估方式不同,如示例中的#elif情况?