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

Mat*_*agé 21 c++ 64-bit c-preprocessor

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

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

Dar*_*ust 24

在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
Run Code Online (Sandbox Code Playgroud)


Mat*_*agé 18

这适用于MSVC++和g ++:

#if defined(_M_X64) || defined(__amd64__)
  // code...
#endif
Run Code Online (Sandbox Code Playgroud)

  • …但是如果您以ARM64或任何其他体系结构为目标,则无法使用。 (4认同)

flo*_*din 9

你为什么选择一个区块而不是另一个区块?如果您的决定基于指针的大小,请使用sizeof(void*) == 8.如果您的决定基于整数的大小,请使用sizeof(int) == 8.

我的观点是,架构本身的名称应该很少有任何区别.出于您的目的,您只需检查您需要检查的内容.您的问题并没有清楚地说明您的检查目的是什么.您要问的是类似于通过查询Windows版本来确定是否安装了DirectX.您可以使用更多便携式和通用工具.

  • @greggo您可以使用例如INT_MAX.例如,参见[<cstdint>](http://en.cppreference.com/w/cpp/types/climits). (3认同)
  • sizeof(int)不是很好的例子.这取决于编译器.我尝试使用g ++的64位Linux,它长4个字节.最好使用sizeof(void*)来确定architecutre.但我不确定它是否在所有机器上都是一样的. (2认同)