在C ++函数中,如果要编译64位架构,我需要编译器选择不同的块。
我知道为MSVC ++和g ++做一个方法,所以我会把它作为答案发布。但是我想知道是否有更好的方法(更优雅,适用于所有编译器/所有64位架构)。如果没有更好的方法,我应该寻找其他预定义的宏以便与其他编译器/架构兼容?
答案 0 :(得分:21)
在C和C ++中检测32位和64位构建的独立于体系结构的方法如下所示:
#!/usr/bin/ruby
require 'rubygems'
require 'json'
require 'open-uri'
require 'uri'
require 'net/http'
payload = 'items.find().include("name","property.*")'
uri = URI.parse("http://server.example.com:8081/artifactory/api/search/aql")
http = Net::HTTP.new(uri.host,uri.port)
req = Net::HTTP::Post.new(uri.path)
req["Content-Type"] = "text/plain"
req.basic_auth 'admin', 'password'
req.body = payload
res = http.request(req)
puts res.body
答案 1 :(得分:18)
这适用于MSVC ++和g ++:
#if defined(_M_X64) || defined(__amd64__)
// code...
#endif
答案 2 :(得分:9)
为什么选择一个区块而不是另一个区块?如果您的决定基于指针的大小,请使用sizeof(void*) == 8
。如果您的决定基于整数的大小,请使用sizeof(int) == 8
。
我的观点是,架构本身的名称应该很少有任何区别。出于您的目的,您只需检查您需要检查的内容。您的问题并没有清楚地说明您的检查目的是什么。您要问的是类似于通过查询Windows版本来确定是否安装了DirectX。您可以使用更多便携式和通用工具。
答案 3 :(得分:7)
Raymond covers this。
答案 4 :(得分:2)
#ifdef _LP64
适用于两个平台
答案 5 :(得分:1)
答案 6 :(得分:1)
如果您正在为Windows平台进行编译,则应使用:
#ifdef _WIN64
MSVC编译器为x64和ia64平台定义了这个(你不想削减那个市场,对吗?)。我不确定gcc是否会做同样的事情 - 但如果没有,那就应该。
另一种选择是
#ifdef WIN64
有一个微妙的区别。 WIN64(没有前导下划线)由SDK(或构建配置)定义。由于这是由SDK / build配置定义的,因此它应该与gcc一样好。
答案 7 :(得分:-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);
}