【问题标题】:C/pre-processor: detect if a __builtin function is availableC/预处理器:检测 __builtin__ 函数是否可用
【发布时间】: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


    【解决方案1】:

    __builtin_bswap16 不可用是一个 gcc 错误,was fixed in gcc 4.8

    【讨论】:

      【解决方案2】:

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

      static inline unsigned short __builtin_bswap16(unsigned short a)
      {
          return (a<<8)|(a>>8);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-08
        • 2011-07-02
        • 2010-09-23
        • 2013-07-18
        • 1970-01-01
        • 2012-05-29
        • 2020-03-16
        相关资源
        最近更新 更多