#define X Defined(Y) 是有效的 C/C++ 宏定义吗?

Luc*_*ndi 4 c c++ macros c-preprocessor

我在某处读到

#define X defined(Y)
Run Code Online (Sandbox Code Playgroud)

无效,但似乎有效。

这是一个例子:

#define WIN_PLAT defined(_WIN32)

#if WIN_PLAT
#    undef  WIN_PLAT
#    define WIN_PLAT 1
#else
#    undef  WIN_PLAT
#    define WIN_PLAT 0
#endif
Run Code Online (Sandbox Code Playgroud)

Eri*_*hil 7

当指令中的宏#if生成defined标记时,根据 C 2018 6.10.1 4,C 标准未定义该行为:

\n
\n

defined\xe2\x80\xa6 如果由于此替换过程而生成标记,或者使用defined一元运算符与宏替换之前的两个指定形式之一不匹配,则行为未定义\xe2\x80\xa6

\n
\n

由于行为是未定义的,编译器可以自由地支持它,也可以自由地不支持它。因此,您不能普遍依赖它。

\n

实施#define X defined(Y),您可以使用:

\n
#if defined Y\n    #define X 1\n#else\n    #define X 0\n#endif\n
Run Code Online (Sandbox Code Playgroud)\n

(这与最初的意图不同,这将X根据是否Y在该宏所在的点定义来设置X,而不是在替换它的位置进行设置。)

\n

C++也有同样的限制。C++ 2020 草案 N4849 15.2 [cpp.cond] 10 说:

\n
\n

defined\xe2\x80\xa6 如果由于此替换过程而生成标记,或者使用defined一元运算符与宏替换之前的两个指定形式之一不匹配,则行为未定义。

\n
\n