__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 это охватывает функцию.

Другие вопросы по тегам