在C ++函数中,如果要编译64位架构,我需要编译器选择不同的块。

我知道为MSVC ++和g ++做一个方法,所以我会把它作为答案发布。但是我想知道是否有更好的方法(更优雅,适用于所有编译器/所有64位架构)。如果没有更好的方法,我应该寻找其他预定义的宏以便与其他编译器/架构兼容?

有帮助吗?

解决方案

为什么选择一个区块而不是另一个区块?如果您的决定基于指针的大小,请使用 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

适用于两个平台

如果您正在为Windows平台进行编译,则应使用:

#ifdef _WIN64

MSVC编译器为x64和ia64平台定义了这个(你不想削减那个市场,对吗?)。我不确定gcc是否会做同样的事情 - 但如果没有,那就应该。

另一种选择是

#ifdef WIN64

有一个微妙的区别。 WIN64(没有前导下划线)由SDK(或构建配置)定义。由于这是由SDK / build配置定义的,因此它应该与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);
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top