26

C++ 関数では、64 ビット アーキテクチャ用にコンパイルする場合、コンパイラが別のブロックを選択する必要があります。

MSVC ++とg ++でそれを行う方法を知っているので、回答として投稿します。ただし、より良い方法があるかどうかを知りたいです(すべてのコンパイラ/すべての64ビットアーキテクチャで機能するよりエレガントな方法)。より良い方法がない場合、他のコンパイラ/アーキテクチャと互換性を持たせるために、他にどの定義済みマクロを探す必要がありますか?

4

8 に答える 8

36

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
于 2015-09-22T12:39:30.757 に答える
22

これは、MSVC++ およびg++次の場合に機能します。

#if defined(_M_X64) || defined(__amd64__)
  // code...
#endif
于 2008-10-02T15:38:27.083 に答える
7

なぜ他のブロックよりも 1 つのブロックを選択するのですか? ポインターのサイズに基づいて決定する場合は、 を使用しますsizeof(void*) == 8。決定が整数のサイズに基づいている場合は、 を使用しますsizeof(int) == 8

私の言いたいことは、アーキテクチャ自体の名前がほとんど違いを生むべきではないということです。やろうとしていることの目的のために、チェックする必要があるものだけをチェックします。あなたの質問は、チェックの目的が何であるかを明確にカバーしていません。あなたが求めているのは、Windows のバージョンを照会して DirectX がインストールされているかどうかを判断しようとすることに似ています。よりポータブルで汎用的なツールを自由に使用できます。

于 2009-02-15T17:05:55.670 に答える
6

レイモンドがこれをカバーしています。

于 2008-10-02T15:47:43.647 に答える
2
#ifdef _LP64

両方のプラットフォームで動作します

于 2008-10-06T23:28:38.263 に答える
2

Windows プラットフォーム用にコンパイルする場合は、次を使用する必要があります。

#ifdef _WIN64

MSVC コンパイラは、x64 と ia64 の両方のプラットフォームに対してそれを定義しています (その市場を切り出したくありませんよね?)。gcc が同じことを行うかどうかはわかりませんが、そうでない場合はそうすべきです。

代替案は

#ifdef WIN64

微妙な違いがあります。WIN64 (先頭のアンダースコアなし) は、SDK (またはビルド構成) によって定義されます。これは SDK/ビルド構成によって定義されるため、gcc でも同様に機能するはずです。

于 2008-10-02T19:05:48.973 に答える
1

Mac OS X の概要は次のとおりです。

http://developer.apple.com/documentation/Darwin/Conceptual/64bitPorting

于 2008-10-02T16:14:52.597 に答える
-3

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);
    }
于 2012-04-14T06:07:54.493 に答える