如何检测我是否正在使用C ++编译64位架构
-
03-07-2019 - |
题
在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);
}
不隶属于 StackOverflow