C または C++ コードをコンパイルするときに CPU アーキテクチャを見つける最も信頼できる方法は何ですか? 私が知る限り、さまざまなコンパイラには独自の非標準プリプロセッサ定義のセットがあります(_M_X86
MSVS、__i386__
GCC__arm__
など)。
私が構築しているアーキテクチャを検出する標準的な方法はありますか? そうでない場合、すべての定型文を含むヘッダーなど、さまざまなコンパイラのそのような定義の包括的なリストのソースはあり#ifdef
ますか?
C または C++ コードをコンパイルするときに CPU アーキテクチャを見つける最も信頼できる方法は何ですか? 私が知る限り、さまざまなコンパイラには独自の非標準プリプロセッサ定義のセットがあります(_M_X86
MSVS、__i386__
GCC__arm__
など)。
私が構築しているアーキテクチャを検出する標準的な方法はありますか? そうでない場合、すべての定型文を含むヘッダーなど、さまざまなコンパイラのそのような定義の包括的なリストのソースはあり#ifdef
ますか?
コンパイラ間の標準はありませんが、各コンパイラはかなり一貫している傾向があります。次のような自分用のヘッダーを作成できます。
#if MSVC
#ifdef _M_X86
#define ARCH_X86
#endif
#endif
#if GCC
#ifdef __i386__
#define ARCH_X86
#endif
#endif
何千ものコンパイラがありますが、広く使用されているのは 3 ~ 4 つだけです (Microsoft C++、GCC、Intel CC、おそらく TenDRA?)。アプリケーションがサポートするコンパイラを決定し、それらの #defines をリストし、必要に応じてヘッダーを更新するだけです。
特定のプラットフォームで利用可能なすべての機能をダンプしたい場合は、次のように GCC を実行できます。
gcc -march=native -dM -E - </dev/null
、など#define __SSE3__ 1
のマクロをダンプします。#define __AES__ 1
標準的なものは何もありません。Brian Hook は、これらの多くを彼の「Portable Open Source Harness」で文書化し、それらを首尾一貫して使用可能なものにしようとさえしています (それに関しては ymmv)。このサイトの posh.h ヘッダーを参照してください。
上記のリンクでは、少し前に DOS 攻撃が行われたため、偽のユーザー ID/パスワードを入力する必要がある場合があります。
CPU 機能の詳細な検出が必要な場合、最善の方法は、CPU がサポートする一連の機能を標準出力または「cpu_config.h」ファイルに出力する CPUID プログラムも出荷することです。次に、そのプログラムをビルド プロセスに統合します。