如何检测我是否正在使用C ++编译64位架构

时间:2008-10-02 15:37:33

标签: c++ 64-bit c-preprocessor

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

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

8 个答案:

答案 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);
    }