Clang的__has_builtin并不总是奏效

时间:2017-03-12 06:18:42

标签: 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编译的。

2 个答案:

答案 0 :(得分:3)

根据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

答案 1 :(得分:0)

要添加到@ktns的答案:要测试是否存在类似函数的关键字,可以使用!__is_identifier()。或者,您可以搜索__has_extension or __has_feature中包含该功能的参数。