簡體   English   中英

如何檢測我是否正在用 C++ 編譯 64 位架構

[英]How can I detect if I'm compiling for a 64bits architecture in C++

在 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

你為什么選擇一個街區而不是另一個街區? 如果您的決定是基於指針的大小,請使用sizeof(void*) == 8 如果您的決定基於整數的大小,請使用sizeof(int) == 8

我的觀點是架構本身的名稱應該很少有任何區別。 你只檢查你需要檢查的東西,為了你將要做的事情。 你的問題沒有很清楚地說明你檢查的目的是什么。 您所問的問題類似於嘗試通過查詢 Windows 版本來確定是否安裝了 DirectX。 您可以使用更多可移植和通用的工具。

雷蒙德涵蓋了這一點

如果您正在為 Windows 平台編譯,則應使用:

#ifdef _WIN64

MSVC 編譯器為 x64 和 ia64 平台定義了這一點(您不想切斷那個市場,是嗎?)。 我不確定 gcc 是否也這樣做 - 但如果沒有,它應該這樣做。

另一種選擇是

#ifdef WIN64

這有一個微妙的區別。 WIN64(不帶前導下划線)由 SDK(或構建配置)定義。 由於這是由 SDK/build 配置定義的,因此它應該與 gcc 一樣好。

#ifdef _LP64

適用於兩個平台

如果您使用的是 Windows,則最好從注冊表中獲取“PROCESSOR_ARCHITECTURE”環境變量,因為如果它的 32 位進程在 64 位操作系統(又名 WOW64)上運行,則 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);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM