关于以下测试代码,预期结果是由于#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
编译的。
答案 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
中包含该功能的参数。