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)
当指令中的宏#if
生成defined
标记时,根据 C 2018 6.10.1 4,C 标准未定义该行为:
\n\n\n
defined
\xe2\x80\xa6 如果由于此替换过程而生成标记,或者使用defined
一元运算符与宏替换之前的两个指定形式之一不匹配,则行为未定义\xe2\x80\xa6
由于行为是未定义的,编译器可以自由地支持它,也可以自由地不支持它。因此,您不能普遍依赖它。
\n实施#define X defined(Y)
,您可以使用:
#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
,而不是在替换它的位置进行设置。)
C++也有同样的限制。C++ 2020 草案 N4849 15.2 [cpp.cond] 10 说:
\n\n\n\n
defined
\xe2\x80\xa6 如果由于此替换过程而生成标记,或者使用defined
一元运算符与宏替换之前的两个指定形式之一不匹配,则行为未定义。