わずかに異なる要件:コードを実行せずに、コンパイルターゲットマシンがビットエンディアンかリトルエンディアンかを判断するために、プログラムビルド構成スクリプトでこのようなテストが必要です。スクリプトは#define HAVE_LITTLE_ENDIAN 1
、config.h
ヘッダーまたはその他に配置する必要があります#define HAVE_LITTLE_ENDIAN 0
。
コンパイル対象のマシンはビルドマシンとは異なる場合があります。これは、クロスコンパイルが行われる可能性があるためです。これは、テストがコンパイルされたコードを実行してはならない理由も説明します。printf
答えを吐き出すステートメントを含む小さなCプログラムを作成するのは問題外です。
可能な解決策はこれです。conftest.c
これを含むというファイルを生成します。
#define USPELL(C0, C1, C2, C3) \
((unsigned) C0 << 24 | \
(unsigned) C1 << 16 | \
(unsigned) C2 << 8 | (unsigned) C3)
unsigned x[6] = {
0,
USPELL('L', 'I', 'S', 'P'),
USPELL('U', 'N', 'I', 'X'),
USPELL('C', 'O', 'R', 'E'),
USPELL('D', 'W', 'I', 'M'),
0
};
次に、これを次のようにコンパイルしますconftest.o
。
$ /path/to/cross-compiling/cc conftest.c -c
次に実行します:
$ strings conftest.o
PSILXINUEROCMIWD
文字列PSILXINUEROCMIWD
が発生する場合、ターゲットはリトルエンディアンです。文字列LISPUNIXCOREDWIM
が発生する場合、それはビッグエンディアンです。どちらの文字列も発生しないか、さらに驚くべきことに、両方が発生する場合、テストは失敗しています。
このアプローチは、プログラムで計算された「fourcc」定数がマシンに依存しない値を持ち、エンディアンに関係なく同じ整数を示すために機能します。オブジェクトファイル内のストレージ表現は、ターゲットシステムのエンディアンに従います。これは、の文字ベースのビューを介して表示されstrings
ます。
2つのゼロガードワードにより、文字列が分離されます。これは厳密に必要というわけではありませんが、探している文字列が他の文字列に埋め込まれていないことを保証します。つまり、strings
それ自体で行に出力します。
PS USPELL
マクロは、再利用ではなく、この特定の目的のために作成されているため、引数の挿入を括弧で囲みません。