测试内置/内在函数

时间:2010-12-01 08:12:27

标签: c gcc intrinsics

我有一些使用gcc内在函数的代码。我希望包含代码,以防内在缺失。我怎么能这样做?

#ifdef __builtin_ctzll

不起作用。

3 个答案:

答案 0 :(得分:5)

使用最新版本的clang,现在可以使用__has_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
}

让我们希望海湾合作委员会将来也会支持__has_builtin()

答案 1 :(得分:3)

唯一可以开箱即用的是测试gcc版本,并希望在所有架构上始终如一。

这不能保证,但我最近遇到了类似的问题,不是内置函数,而是__thread用于线程本地存储。这是在一些架构(linux)上实现的,但在其他架构(OS X,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

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

答案 2 :(得分:2)

#ifdef指令检查__builtin_ctzll是否定义为名称,它无法帮助您确定__builtin_ctzll 函数是否< / em>存在。

我对gcc builtins不太熟悉,不仅仅是为了帮助你:内在如何失踪?