关于gcc:C /预处理器:检测__builtin函数是否可用

C/pre-processor: detect if a __builtin function is available

是否有可能确定编译器是否提供了诸如__builtin_bswap16之类的内在函数?优选地,我希望能够仅使用预处理器来确定此功能是否存在。

在我的特定情况下,我在代码中使用了__builtin_bswap16 / 32/64函数,当针对32位编译时,该函数在GCC 4.x上可以正常工作。后来我切换到64位Linux,发现__builtin_bswap16突然消失了-我收到了链接器错误:

"undefined reference to `__builtin_bswap16'".

我想这与64位模式下某些ASM操作的可用性有关。

稍后,我试图在另一台机器上编译此代码,不幸的是,该机器仅安装了较旧版本的GCC,而根本不支持这些功能。

我想使此代码在任何地方都可以编译,使用提供的__builtin_bswap函数,如果没有,可以使用手工编码的byteswap例程。是否可以仅使用预处理器来实现此目的?

我显而易见的尝试,例如:

1
2
3
4
5
6
7
8
9
10
...
#define MYBSWAP16(v) (v>>8)|(v<<8)
#ifdef __builtin_bswap16
printf("bswap16 is defined : %04x\
"
, __builtin_bswap16(0x1234));
#else
printf("bswap16 is not defined : %04x\
"
, MYBSWAP16(0x1234) );
#endif
...

失败,因为始终将__builtin_bswap16 / 32/64评估为未定义。有什么方法可以使其在C源代码中自动工作,还是在Makefile中手动定义常量的唯一方法,例如HAVE_BSWAP并通过-D选项传递它们?

请注意,我的问题不一定特定于__builtin_bswap,我正在寻找一种检测某些功能是否可用的通用方法。


某些gcc版本缺少它,您可以随时将其添加到您的代码中:

1
2
3
4
static inline unsigned short __builtin_bswap16(unsigned short a)
{
    return (a<<8)|(a>>8);
}

__ builtin_bswap16的不可用是gcc错误,已在gcc 4.8中修复。