5

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

在我的特殊情况下,我__builtin_bswap16在代码中使用了 / 32 / 64 函数,这些函数在编译 32 位时与 GCC 4.x 配合得很好。后来我切换到 64 位 Linux 并注意到它 __builtin_bswap16突然消失了 - 我收到了链接器错误:

“对‘__builtin_bswap16’的未定义引用”。

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

后来我试图在另一台机器上编译这段代码,不幸的是只安装了旧版本的 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,我正在寻找一种通用方法来检测某些功能是否可用。

4

2 回答 2

3

__builtin_bswap16 不可用是一个 gcc 错误,已在 gcc 4.8 中修复

于 2013-08-13T12:38:57.937 回答
3

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

static inline unsigned short __builtin_bswap16(unsigned short a)
{
    return (a<<8)|(a>>8);
}
于 2014-02-21T14:43:25.363 回答