为什么定义的(X)在没有空格的预处理器定义中不起作用?

Dev*_*vin 4 c++ visual-c++

包含的预处理程序定义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情况?

mkj*_*mkj 5

defined特定于#if#elif.通过宏扩展使用它时,行为是不确定的.