是否有可能以某种方式确定编译器是否提供了内部函数,例如__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
,我正在寻找检测某些功能是否可用的一般方法。
答案 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);
}