__Has_builtin Clang не всегда работает
Что касается следующего тестового кода, ожидаемый результат состоял в том, что он не будет компилироваться из-за #error
директивы.
#if __has_builtin(__builtin_types_compatible_p)
#error ("Hello")
#endif
#include <stdio.h>
int main (void)
{
if (__builtin_types_compatible_p(int, const int)) {
printf("INT ARE SAME!!!\n");
}
return 0;
}
Тем не менее, он не только компилирует, но и распечатывает INT ARE SAME!!!
что означает, что даже если __builtin_types_compatible_p
существует, __has_builtin
не обнаруживает это. Почему это? И что еще более важно, есть ли какой-то другой способ обнаружения встроенных функций, которые будут работать?
Это было проверено на Clang 3.8 и 3.9 (текущая стабильная ветвь). Код был скомпилирован с использованием clang --std=c99 -Wall -Wextra test.c
,
1 ответ
По словам разработчика LLVM,
__has_builtin обнаруживает встроенные функции.
В вашем примере __builtin_types_compatible_p
вообще не функция, так как она принимает тип, а не значение.
Так, __has_builtin(__builtin_types_compatible_p)
возвращает false, что в точности соответствует заданному.
http://lists.llvm.org/pipermail/cfe-dev/2017-July/054590.html
Чтобы добавить к ответу @ktns: чтобы проверить наличие подобных ключевых слов, вы можете использовать !__is_identifier()
, Кроме того, вы можете найти аргумент __has_extension
или же __has_feature
это охватывает функцию.