我需要知道gcc是否有一种方法可以检查那些很棒的__builtin_MY_DESIRED_FUNCTIONs
例如,我想使用__builtin_nan
并确保它可用于我的程序,并且在编译期间不会失败。
我将更具体:在clang上有__has_builtin
“检查器”,因此我们可以像
#if __has_builtin(__builtin_nan)
但是我找不到gcc的类似物。
大概我可以依靠gcc,例如“哦,我现在在gcc上,让我们假设所有__builtin_
都在下面的示例中……”
#if __GNUC__
double mynan = __builtin_nan("0");
#endif
它可能会起作用,直到有人放置此“ -fno-builtin”编译标志为止。
答案 0 :(得分:3)
否,您将必须使用__GNUC__
和__GNUC_MINOR__
(如果使用此类gcc版本,则必须使用__GNUC_PATCHLEVEL__
)来测试每个特定于发行版的内置函数(可以找到gcc发行版,{ {3}})
例如:
/* __builtin_mul_overflow_p added in gcc 7.4 */
#if (__GNUC__ > 7) || \
((__GNUC__ == 7) && (__GNUC_MINOR__ > 3))
#define BUILTIN_MUL_OVERFLOW_EXIST
#endif
#ifdef BUILTIN_MUL_OVERFLOW_EXIST
int c = __builtin_mul_overflow_p (3, 2, 3) ? 0 : 3 * 2;
#endif
here中有一个完全符合您要求的公开错误。
答案 1 :(得分:0)
好消息!在GCC 10中添加了__has_builtin
(请参见change notes):
特殊运算符__has_builtin(operand)可以在常量中使用 整数上下文,并在预处理器“ #if”和“ #elif”表达式中 测试以其操作数命名的符号是否被识别为 GCC在当前语言和一致性模式下内置的功能。 如果计算结果为非零值的常数整数 参数指的是这样的函数,否则为零。的 运算符也可以在预处理器“ #if”和“ #elif”中使用 表达式。 __has_builtin运算符本身,没有任何操作数 或括号,充当预定义的宏,以便可以对其进行支持 用可移植的代码进行测试。因此,推荐使用该运算符 如下:
#if defined __has_builtin
# if __has_builtin (__builtin_object_size)
# define builtin_object_size(ptr) __builtin_object_size (ptr, 2)
# endif
#endif
#ifndef builtin_object_size
# define builtin_object_size(ptr) ((size_t)-1)
#endif