C ++で64ビットアーキテクチャ用にコンパイルしているかどうかをどのように検出できますか
-
03-07-2019 - |
質問
C ++関数では、64ビットアーキテクチャ用にコンパイルしている場合、コンパイラが別のブロックを選択する必要があります。
MSVC ++およびg ++でそれを行う方法を知っているので、回答として投稿します。しかし、より良い方法があるかどうかを知りたい(すべてのコンパイラ/すべての64ビットアーキテクチャで動作するよりエレガントな)。より良い方法がない場合、他のコンパイラー/アーキテクチャーと互換性を保つために、他の事前定義マクロを探す必要がありますか?
解決
なぜ他のブロックよりも1つのブロックを選択するのですか?ポインタのサイズに基づいて決定する場合は、 sizeof(void *)== 8
を使用します。整数のサイズに基づいて決定する場合は、 sizeof(int)== 8
を使用します。
私のポイントは、アーキテクチャの名前自体がほとんど違いを生むべきではないということです。あなたがやろうとしていることの目的のために、あなたがチェックする必要があるものだけをチェックします。あなたの質問は、あなたのチェックの目的が非常に明確にカバーされていません。あなたが求めているのは、Windowsのバージョンを照会することによってDirectXがインストールされているかどうかを判断しようとすることと似ています。より自由で汎用的なツールを自由に使用できます。
他のヒント
CおよびC ++で32ビットおよび64ビットビルドを検出するアーキテクチャに依存しない方法は次のようになります。
// C
#include <stdint.h>
// C++
#include <cstdint>
#if INTPTR_MAX == INT64_MAX
// 64-bit
#elif INTPTR_MAX == INT32_MAX
// 32-bit
#else
#error Unknown pointer size or missing size macros!
#endif
これはMSVC ++およびg ++で機能します:
#if defined(_M_X64) || defined(__amd64__)
// code...
#endif
Raymond これをカバー。
>#ifdef _LP64
両方のプラットフォームで動作します
Mac OS Xの概要は次のとおりです。
http://developer.apple.com/documentation/Darwin/Conceptual/64bitPorting
Windowsプラットフォーム用にコンパイルする場合は、次を使用する必要があります。
#ifdef _WIN64
MSVCコンパイラは、x64プラットフォームとia64プラットフォームの両方を定義しています(その市場を切り捨てたくないのですか?)。 gccが同じことをするかどうかはわかりませんが、同じことをする必要があります。
別の方法は
#ifdef WIN64
微妙な違いがあります。 WIN64(先頭のアンダースコアなし)は、SDK(またはビルド構成)によって定義されます。これはSDK / build configで定義されているため、gccでも同様に機能するはずです。
Windowsを使用している場合は、おそらく「PROCESSOR_ARCHITECTURE」を取得することをお勧めします。 64ビットオペレーティングシステム(別名WOW64)で32ビットプロセスが実行されている場合、sizeof(PVOID)は4に等しいため、レジストリの環境変数:
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SYSTEM\CurrentControlSet\\Control\\Session Manager\\Environment"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
LPSTR szArch = new CHAR[100];
ZeroMemory(szArch, 100);
if (RegQueryValueEx(hKey, _T("PROCESSOR_ARCHITECTURE"), NULL, NULL, (LPBYTE)szArch, &dwSize) == ERROR_SUCCESS) {
if (strcmp(szArch, "AMD64") == 0)
this->nArchitecture = 64;
else
this->nArchitecture = 32;
} else {
this->nArchitecture = (sizeof(PVOID) == 4 ? 32 : 64);
}
RegCloseKey(hKey);
}