Spec-Zone.ru › GCC 11 CPP

Предыдущий: __has_builtin, Вверх: Условный синтаксис [Оглавление][Индекс]

4.2.10 __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-11.4.0/cpp/_005f_005fhas_005finclude.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API