9

我有一些使用 gcc 内在函数的代码。我想包含代码以防内在缺失。我怎样才能做到这一点?

#ifdef __builtin_ctzll

不起作用。

4

3 回答 3

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
}

让我们希望 GCC 将来也能支持__has_builtin()

于 2013-01-28T22:13:12.317 回答
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

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

于 2010-12-01T08:49:24.027 回答
2

#ifdef指令检查是否__builtin_ctzll定义为名称,它不会帮助您确定__builtin_ctzll 函数是否存在。

我对 gcc 内置函数不够熟悉,无法为您提供更多帮助:内在函数怎么会丢失?

于 2010-12-01T08:22:39.273 回答