Next: __has_embed, Previous: __has_extension, Up: Conditional Syntax [Contents][Index]
__has_include, __has_include_nextThe special operators __has_include (operand) and __has_include_next (operand) may be used in #if and #elif expressions to test whether the header referenced by their operand can be included using the #include and #include_next directive, respectively. Using the operators in other contexts is not valid. The operand takes the same form as the file in the #include and #include_next directives respectively (see Include Syntax) and the operators evaluate to a nonzero value if the header can be included and to zero otherwise. Note that that the ability to include a header doesnt imply that the header doesnt contain invalid constructs or #error directives that would cause the preprocessor to fail.
The __has_include and __has_include_next operators by themselves, without any operand or parentheses, act as predefined macros so that support for them can be tested in portable code. Thus, the recommended use of the operators 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 dont.
#if defined __has_include && __has_include ("header.h") /* not portable */
#endif
The same holds for __has_include_next.