我有一些使用gcc内部函数的代码。我想包含一些代码以防内部函数丢失。我该怎么做呢?
#ifdef __builtin_ctzll
不起作用。
xqkwcwgp1#
唯一应该开箱即用的事情是测试gcc版本,并希望这在所有架构上都能一致地完成。不过这并不能保证,我最近遇到了一个类似的问题,不是内置函数的问题,而是线程本地存储的__thread的问题。这在一些体系结构(linux)上实现,但在其他体系结构(OS X,bsd?)上没有实现,而且没有办法用宏来发现这一点。如果你有gnu make,你可以做一些类似的事情来检测你的Makefile中是否存在一个特定的函数:
__thread
__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
这避免了使用更复杂的配置实用程序。
uwopmtnx2#
#ifdef指令检查__builtin_ctzll是否定义为一个 * 宏 * 名称,它不会帮助您确定__builtin_ctzll * 函数 * 是否存在。我对gcc内置函数的了解还不够,无法提供比这更多的帮助:内在的东西怎么会不见了呢
#ifdef
__builtin_ctzll
41zrol4v3#
在clang的最新版本中,现在可以使用__has_builtin()宏来检查内置的intrinsic是否存在。
__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()。
agyaoht74#
GCC现在(最近几年)支持__has_builtin:它于2020年5月7日在GCC 10.1中引入。另外,感谢@Charles评论,找到错误报告here
__has_builtin
4条答案
按热度按时间xqkwcwgp1#
唯一应该开箱即用的事情是测试gcc版本,并希望这在所有架构上都能一致地完成。
不过这并不能保证,我最近遇到了一个类似的问题,不是内置函数的问题,而是线程本地存储的
__thread
的问题。这在一些体系结构(linux)上实现,但在其他体系结构(OS X,bsd?)上没有实现,而且没有办法用宏来发现这一点。如果你有gnu make,你可以做一些类似的事情来检测你的Makefile中是否存在一个特定的函数:
这避免了使用更复杂的配置实用程序。
uwopmtnx2#
#ifdef
指令检查__builtin_ctzll
是否定义为一个 * 宏 * 名称,它不会帮助您确定__builtin_ctzll
* 函数 * 是否存在。我对gcc内置函数的了解还不够,无法提供比这更多的帮助:内在的东西怎么会不见了呢
41zrol4v3#
在clang的最新版本中,现在可以使用
__has_builtin()
宏来检查内置的intrinsic是否存在。希望GCC将来也能支持
__has_builtin()
。agyaoht74#
GCC现在(最近几年)支持
__has_builtin
:它于2020年5月7日在GCC 10.1中引入。另外,感谢@Charles评论,找到错误报告here