如何检测我是否正在为C ++中的64位体系结构进行编译

时间:2020-03-06 15:02:03  来源:igfitidea点击:

在C ++函数中,如果要针对64位体系结构进行编译,则我需要编译器选择其他块。

我知道一种针对MSVC ++和g ++的方法,因此我将其发布为答案。但是我想知道是否有更好的方法(更优雅的方法适用于所有编译器/所有64位体系结构)。如果没有更好的方法,我还应该寻找哪些其他预定义的宏才能与其他编译器/体系结构兼容?

解决方案

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

#if defined(_M_X64) || defined(__amd64__)
  // code...
#endif

雷蒙德对此进行了介绍。

这是Mac OS X的一个很好的概述:

http://developer.apple.com/documentation/Darwin/Conceptual/64bitPorting

如果要针对Windows平台进行编译,则应使用:

#ifdef _WIN64

MSVC编译器为x64和ia64平台都定义了这一点(我们不想削减这个市场,对吗?)。我不确定gcc是否会执行相同的操作,但是否应该执行相同的操作。

另一种方法是

#ifdef WIN64

这有细微的差别。 WIN64(不带下划线)由SDK(或者构建配置)定义。由于这是由SDK / build配置定义的,因此它在gcc上也应该可以正常工作。

#ifdef _LP64

在两个平台上均可使用

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

我的观点是,架构本身的名称很少会有所不同。我们只需要检查要检查的内容即可。问题并未很清楚地涵盖支票目的是什么。我们要问的是类似于通过查询Windows版本来确定是否已安装DirectX。我们可以使用更多便携式和通用工具。