关于 C 语言的__has_include 操作符
特殊操作符 __has_include(operand) 和 __has_include_next(operand) 可以在 '#if' 和 '#elif' 表达式中使用,以测试其操作数所引用的头文件是否可以分别通过 '#include' 和 '#include_next' 指令包含。在其他上下文中使用这些操作符是无效的。操作数的形式与 '#include' 和 '#include_next' 指令中的文件形式相同(参见包含语法),如果头文件可以被包含,操作符的值为非零,否则为零。请注意,能够包含某个头文件并不意味着该头文件中不包含会导致预处理失败的无效结构或 '#error' 指令。
仅使用 __has_include 和 __has_include_next 操作符本身,而不带任何操作数或括号时,它们作为预定义宏,可用于在可移植代码中测试对它们的支持。因此,推荐的操作符使用方式如下:
```c
#if defined __has_include
# if __has_include (<stdatomic.h>)
# include <stdatomic.h>
# endif
#endif
```
第一个 ‘#if’ 测试仅在所使用的 GCC(或其他编译器)版本支持该运算符时才会成功。只有当该测试成功时,才可以将 __has_include 用作预处理器运算符。因此,将两个测试合并为如下所示的单个表达式,仅在支持该运算符的编译器上有效,而在不支持的编译器上则无效。
```c
#if defined __has_include && __has_include ("header.h") /* not portable */
…
#endif
```
__has_include_next 同样适用。