是否有可能以某种方式确定__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
,我正在寻找一种通用方法来检测某些功能是否可用。