如何检测我是否正在为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。我们可以使用更多便携式和通用工具。