5

__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
...

__builtin_bswap16/32/64 は常に未定義と評価されるため、成功しませんでした。Cソース内で自動的に動作させる方法はありますか、またはMakefileで定数を手動で定義する唯一の方法です。たとえばHAVE_BSWAP、オプションを介して渡し-Dますか?

私の質問は必ずしもに固有のものではないことに注意してください__builtin_bswap。特定の機能が利用可能かどうかを検出する一般的な方法を探しています。

4

2 に答える 2

3

__builtin_bswap16 が利用できないのは、gcc 4.8 で修正された gcc のバグです。

于 2013-08-13T12:38:57.937 に答える
3

gcc の一部のバージョンには欠落しているため、いつでも自分でコードに追加できます。

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