C /预处理器:检测__builtin__函数是否可用

时间:2013-08-13 12:08:23

标签: c gcc c-preprocessor

是否有可能以某种方式确定编译器是否提供了内部函数,例如__builtin_bswap16?最好,我希望能够仅使用预处理器来确定此函数是否存在。

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

  

“对__builtin_bswap16'的未定义引用”。

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

稍后我尝试在不同的机器上编译此代码,遗憾的是只安装了旧版本的GCC,并且根本不支持这些功能。

我想让这些代码在任何地方都可编译,如果提供的话,使用__builtin_bswap函数,如果没有,则回退到手工编写的byteswap例程。是否可以通过预处理器以某种方式实现这一目标?

我明显的尝试,例如:

...
#define MYBSWAP16(v) (v>>8)|(v<<8)
#ifdef __builtin_bswap16
printf("bswap16 is defined : %04x\n", __builtin_bswap16(0x1234));
#else
printf("bswap16 is not defined : %04x\n", MYBSWAP16(0x1234) );
#endif
...

未成功,因为__builtin_bswap16 / 32/64始终被评估为未定义。有没有办法让它在 C 源中自动运行,或者是在Makefile中手动定义常量的唯一方法,例如: HAVE_BSWAP并通过-D选项传递给他们?

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

2 个答案:

答案 0 :(得分:3)

__builtin_bswap16不可用是was fixed in gcc 4.8的gcc错误。

答案 1 :(得分:2)

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

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