And*_* R. 2 c++ c-preprocessor
假设我有这样的代码:
#if defined(SOMEDEF) && SOMEDEF >= 5
// ...
#endif
Run Code Online (Sandbox Code Playgroud)
基本上,SOMEDEF可能没有定义但是在运算符的抑制分支中使用&&.GCC接受此代码,但根据标准是否合法?所有编译器都支持这个吗?
严格来说,这取决于.
#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)不是有效的子表达式.
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |