C++ 関数では、64 ビット アーキテクチャ用にコンパイルする場合、コンパイラが別のブロックを選択する必要があります。
MSVC ++とg ++でそれを行う方法を知っているので、回答として投稿します。ただし、より良い方法があるかどうかを知りたいです(すべてのコンパイラ/すべての64ビットアーキテクチャで機能するよりエレガントな方法)。より良い方法がない場合、他のコンパイラ/アーキテクチャと互換性を持たせるために、他にどの定義済みマクロを探す必要がありますか?
C++ 関数では、64 ビット アーキテクチャ用にコンパイルする場合、コンパイラが別のブロックを選択する必要があります。
MSVC ++とg ++でそれを行う方法を知っているので、回答として投稿します。ただし、より良い方法があるかどうかを知りたいです(すべてのコンパイラ/すべての64ビットアーキテクチャで機能するよりエレガントな方法)。より良い方法がない場合、他のコンパイラ/アーキテクチャと互換性を持たせるために、他にどの定義済みマクロを探す必要がありますか?
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
なぜ他のブロックよりも 1 つのブロックを選択するのですか? ポインターのサイズに基づいて決定する場合は、 を使用しますsizeof(void*) == 8
。決定が整数のサイズに基づいている場合は、 を使用しますsizeof(int) == 8
。
私の言いたいことは、アーキテクチャ自体の名前がほとんど違いを生むべきではないということです。やろうとしていることの目的のために、チェックする必要があるものだけをチェックします。あなたの質問は、チェックの目的が何であるかを明確にカバーしていません。あなたが求めているのは、Windows のバージョンを照会して DirectX がインストールされているかどうかを判断しようとすることに似ています。よりポータブルで汎用的なツールを自由に使用できます。
レイモンドがこれをカバーしています。
#ifdef _LP64
両方のプラットフォームで動作します
Windows プラットフォーム用にコンパイルする場合は、次を使用する必要があります。
#ifdef _WIN64
MSVC コンパイラは、x64 と ia64 の両方のプラットフォームに対してそれを定義しています (その市場を切り出したくありませんよね?)。gcc が同じことを行うかどうかはわかりませんが、そうでない場合はそうすべきです。
代替案は
#ifdef WIN64
微妙な違いがあります。WIN64 (先頭のアンダースコアなし) は、SDK (またはビルド構成) によって定義されます。これは SDK/ビルド構成によって定義されるため、gcc でも同様に機能するはずです。
Mac OS X の概要は次のとおりです。
http://developer.apple.com/documentation/Darwin/Conceptual/64bitPorting
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);
}