#if defined(token)&& token == ... - 这种语法合法吗?

And*_* R. 2 c++ c-preprocessor

假设我有这样的代码:

#if defined(SOMEDEF) && SOMEDEF >= 5
  // ...
#endif
Run Code Online (Sandbox Code Playgroud)

基本上,SOMEDEF可能没有定义但是在运算符的抑制分支中使用&&.GCC接受此代码,但根据标准是否合法?所有编译器都支持这个吗?

H W*_*ers 6

严格来说,这取决于.

#if defined(SOMEDEF) && SOMEDEF >= 5
Run Code Online (Sandbox Code Playgroud)

如果满足下列条件之一,则是合法的:

  • SOMEDEF被定义,宏观膨胀SOMEDEF使得上面是一个有效的表达式.
  • SOMEDEF没有定义的.在这种情况下,SOMEDEF >= 5仍然是一个有效的表达式.请注意,在宏替换(和defined运算符评估)之后,任何未定义的标识符(除了true/ false)都将替换为0; 0 >= 5是一个有效的子表达式.

例如,这是正确的:

#define SOMEDEF 0(0)
#if defined(SOMEDEF) && SOMEDEF >= 5
Run Code Online (Sandbox Code Playgroud)

...因为0(0) >= 5不是有效的子表达式.

例如,`#if defined(__ has_cpp_attribute)&& __has_cpp_attribute(deprecated)`不起作用

你的意思是说,当__has_cpp_attribute没有定义时,这不起作用.在这种情况下也会发生同样的事情; 0(0)不是有效的子表达式.