C /预处理器:检测__builtin功能是否可用

Ang*_*gro 5 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
...
Run Code Online (Sandbox Code Playgroud)

没有成功,因为__builtin_bswap16/ 32/64总是被评估为未定义.有没有办法让它在C源代码中自动工作,或者是在Makefile中手动定义常量的唯一方法,例如HAVE_BSWAP并通过-D选项传递它们?

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

Mar*_*han 3

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