【发布时间】:2013-08-13 12:08:22
【问题描述】:
是否有可能以某种方式确定编译器是否提供了内部函数,例如__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,我正在寻找一种通用方法来检测某些功能是否可用。
【问题讨论】:
标签: c gcc c-preprocessor