4.2.12 __has_include
Специальный оператор __has_include (operand) может быть использован в выражениях ‘#if’ и ‘#elif’ для проверки, может ли заголовочный файл, на который ссылается его операнд, быть включён с помощью директивы ‘#include’. Использование оператора в других контекстах некорректно. Операнд принимает ту же форму, что и файл в директиве ‘#include’ (см. Синтаксис включения) и вычисляется как ненулевое значение, если заголовок может быть включён, и как нулевое в противном случае. Обратите внимание, что возможность включения заголовка не подразумевает, что заголовок не содержит недопустимых конструкций или директивы ‘#error’, которые могут привести к ошибке препроцессора.
Оператор __has_include сам по себе, без операнда или скобок, действует как предопределённая макрос, чтобы можно было проверить его поддержку в переносимом коде. Таким образом, рекомендуемое использование оператора таково:
#if defined __has_include # if __has_include (<stdatomic.h>) # include <stdatomic.h> # endif #endif
Первый тест ‘#if’ выполняется успешно только тогда, когда оператор поддерживается используемой версией GCC (или другим компилятором). Только при успешном выполнении этого теста допустимо использование __has_include как оператора препроцессора. В результате объединение этих двух тестов в одно выражение, как показано ниже, будет допустимо только с компилятором, поддерживающим этот оператор, но не с другими, которые его не поддерживают.
#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-14.2.0/cpp/_005f_005fhas_005finclude.html