4.2.10 __has_include
The special operator __has_include (operand)
may be used in ‘#if’ and ‘#elif’ expressions to test whether the header referenced by its operand can be included using the ‘#include’ directive. Using the operator in other contexts is not valid. The operand takes the same form as the file in the ‘#include’ directive (see Include Syntax) and evaluates to a nonzero value if the header can be included and to zero otherwise. Note that that the ability to include a header doesn’t imply that the header doesn’t contain invalid constructs or ‘#error’ directives that would cause the preprocessor to fail.
The __has_include
operator by itself, without any operand or parentheses, acts as a predefined macro so that support for it can be tested in portable code. Thus, the recommended use of the operator is as follows:
#if defined __has_include # if __has_include (<stdatomic.h>) # include <stdatomic.h> # endif #endif
The first ‘#if’ test succeeds only when the operator is supported by the version of GCC (or another compiler) being used. Only when that test succeeds is it valid to use __has_include
as a preprocessor operator. As a result, combining the two tests into a single expression as shown below would only be valid with a compiler that supports the operator but not with others that don’t.
#if defined __has_include && __has_include ("header.h") /* not portable */ … #endif
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.1.0/cpp/_005f_005fhas_005finclude.html