Clang 的 __has_builtin 并不总是有效

标签 c clang c99 built-in clang-extensions

对于以下测试代码,预期的结果是由于 #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 编译的。

最佳答案

注意:自 Clang 10 起,此答案已过时。


根据一位 LLVM 开发人员的说法,

__has_builtin detects builtin functions.

在您的示例中,__builtin_types_compatible_p 是

not a function at all, since it takes a type, not a value.

因此,__has_builtin(__builtin_types_compatible_p) 返回 false,这与设计完全一样。

http://lists.llvm.org/pipermail/cfe-dev/2017-July/054590.html

关于Clang 的 __has_builtin 并不总是有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42744425/

相关文章:

c - int main() { }(没有 "void")在 ISO C 中有效且可移植吗?

C99 如何将简单指针转换为可变长度的多维数组?

c - 尝试在 C99 模式下编译 C 程序代码时出错

c - 在 Windows 中运行 C 程序时权限被拒绝

javascript - 将 Javascript UUID 函数翻译成 C

c++ - 在 switch-case 中打开 else 分支可以吗?

c++ - SFINAE 不适用于 llvm/clang

c - 如何接受未确定大小的字符串输入?

c++ - 跨函数禁用 clang 警告

clang - -march = native使用Clang激活哪些标志?