Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 测试内置/内部功能_C_Gcc_Intrinsics - Fatal编程技术网

C 测试内置/内部功能

C 测试内置/内部功能,c,gcc,intrinsics,C,Gcc,Intrinsics,我有一些使用gcc内部函数的代码。我希望包含代码,以防内部代码丢失。我该怎么做 #ifdef __builtin_ctzll 不起作用。指令检查\uuuuuUltin\uCTZLL是否定义为宏名称,它不会帮助您确定是否存在\uuUltin\uCTZLL函数 我对gcc内置的了解还不够多,无法帮助您解决更多问题:如何缺少内在功能?唯一应该立即解决的问题是测试gcc版本,并希望在所有体系结构上都能做到这一点 但这并不能保证,我最近遇到了一个类似的问题,不是关于内置函数,而是关于线程本地存储的\uu

我有一些使用gcc内部函数的代码。我希望包含代码,以防内部代码丢失。我该怎么做

#ifdef __builtin_ctzll
不起作用。

指令检查
\uuuuuUltin\uCTZLL
是否定义为宏名称,它不会帮助您确定是否存在
\uuUltin\uCTZLL
函数


我对gcc内置的了解还不够多,无法帮助您解决更多问题:如何缺少内在功能?

唯一应该立即解决的问题是测试gcc版本,并希望在所有体系结构上都能做到这一点

但这并不能保证,我最近遇到了一个类似的问题,不是关于内置函数,而是关于线程本地存储的
\uu thread
。这是在某些体系结构(linux)上实现的,但在其他体系结构(OSX、bsd?)上没有实现,并且没有办法通过宏来发现这一点

如果您有gnu make,您可以执行类似的操作来检测Makefile中是否存在特定函数:

__THREAD := $(shell echo '__thread int i;' | ${CC} ${CFLAGS} -xc -c -o /dev/null - 2> /dev/null || echo "NO")
ifeq (${__THREAD},NO)
${warning thread local storage (TLS) with '__thread' is not supported, switching to pthread_getkey}
CFLAGS += -D__GNUC_NO_TLS__
endif

这避免了使用更复杂的配置实用程序。

对于clang的最新版本,现在可以使用
\uu has\u builtin()
宏检查是否存在内置内部函数,例如

int popcount(int x)
{
#if __has_builtin(__builtin_popcount)
  return __builtin_popcount(x);
#else
  int count = 0;
  for (; x != 0; x &= x - 1)
    count++;
  return count;
#endif
}

我们希望GCC将来也能支持

例如,在特定的体系结构上不受支持。您是否有任何迹象表明可能会出现这种情况?目前,您的解决方案只是阻止gcc使用内置的。我猜,在gcc中引入该功能至少5年后,你仍然会看到周围的版本不支持它,一些发行版在适应新版本方面相当缓慢。2012年1月,gcc邮件列表的一些线程中提到了_has_builtin()宏,这个线程也很有希望。但我想GCC4.8已经太晚了,所以我们不得不再等一年。