4.2.6 __has_attribute
Специальный оператор __has_attribute (operand) может использоваться в выражениях «#if» и «#elif» для проверки, распознаёт ли GCC атрибут, на который ссылается его операнд. Использование оператора в других контекстах не допускается. В коде C, если компиляция выполняется с жёстким соответствием стандартам до C23, операнд должен быть допустимым идентификатором. В противном случае операнд может быть необязательно представлен префиксом attribute-scope::. Префикс attribute-scope определяет «пространство имён», в котором распознаётся атрибут. Область действия атрибутов GCC — «gnu» или «__gnu__». Оператор __has_attribute сам по себе, без операнда или скобок, выполняет функцию предопределённого макроса, позволяя проверять его поддержку в переносимом коде. Таким образом, рекомендуется использовать оператор следующим образом:
#if defined __has_attribute # if __has_attribute (nonnull) # define ATTR_NONNULL __attribute__ ((nonnull)) # endif #endif
Первый тест «#if» выполняется успешно только тогда, когда оператор поддерживается используемой версией GCC (или другим компилятором). Только при успешном выполнении этого теста допускается использование __has_attribute в качестве оператора препроцессора. В результате объединение двух тестов в одно выражение, как показано ниже, будет допустимо только с компилятором, поддерживающим оператор, но не с другими, которые его не поддерживают.
#if defined __has_attribute && __has_attribute (nonnull) /* 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_005fattribute.html