Kur*_*urz 6 c macros gcc built-in
我需要知道 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”编译标志。
Ada*_*Er8 15
好消息!__has_builtinGCC 10 中添加了a (请参阅更改说明):
\n\n特殊运算符 __has_builtin (操作数)可用于常量\n整数上下文和预处理器 \xe2\x80\x98#if\xe2\x80\x99 和 \xe2\x80\x98#elif\xe2\x80\x99 表达式中测试由其操作数命名的符号是否被 GCC 在当前语言和一致性模式下识别为内置函数。\n如果参数引用这样的函数,则其计算结果为具有非零值的常量整数,并且否则为零。该运算符还可以用在预处理器 \xe2\x80\x98#if\xe2\x80\x99 和 \xe2\x80\x98#elif\xe2\x80\x99\n 表达式中。__has_builtin 运算符本身不带任何操作数或括号,充当预定义的宏,以便可以在可移植代码中测试对其的支持。因此,建议使用该运算符如下:
\n
#if defined __has_builtin\n#  if __has_builtin (__builtin_object_size)\n#    define builtin_object_size(ptr) __builtin_object_size (ptr, 2)\n#  endif\n#endif\n#ifndef builtin_object_size\n#  define builtin_object_size(ptr)   ((size_t)-1)\n#endif\n不,您必须使用__GNUC__and __GNUC_MINOR__(__GNUC_PATCHLEVEL__如果您使用此类 gcc 版本)来测试每个版本特定的内置函数(gcc 版本可以在这里找到)
例如:
/* __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
并且有一个开放的bug整整你问什么,在这里。
| 归档时间: | 
 | 
| 查看次数: | 1953 次 | 
| 最近记录: |