MSVC内置宏_M_AMD64和_M_X64之间的区别

问题描述 投票:0回答:2

我正在查看 MSVC 文档中的内置宏,并看到以下宏:

_M_AMD64 定义为针对 x64 处理器的编译的整数文字值 100。否则,未定义。

_M_X64 定义为针对 x64 处理器的编译的整数文字值 100。否则,未定义。

另外,下面的宏似乎也有同样的作用?

_WIN64 当编译目标为 64 位 ARM 或 x64 时定义为 1。否则,未定义。

根据文档,它们具有完全相同的定义 - 它们等效吗?是否存在其中一个被定义而另一个没有被定义的情况?如果不是,这里的历史是什么?

c++ visual-c++ macros built-in
2个回答
11
投票

_WIN64 在每个平台/CPU 架构上都有定义,其中

sizeof(void*) >= 8

第一个 64 位 Windows 版本(“Windows XP 64 位版本”)实际上是在 Intel Itanium CPU 上,其宏是 _M_IA64。 AMD 随后决定创建自己的 64 位指令集,其宏为 _M_AMD64,但其第一个桌面 Windows 版本实际上称为“Windows XP Professional x64 Edition”。 Intel 屈服并开始生产支持 AMD64 指令集(EM64T AKA Intel 64)的 CPU,而 Itanium 现在几乎已经死了。

您仍然会在某些位置和文件名中看到 AMD64 名称,但很多人现在只是将其称为 x64 或 x86-64。

_M_AMD64 自该架构开始以来就已经存在,但我不记得 _M_X64 是同时创建的还是后来添加的。您可能需要查看 Visual Studio 2003 和 2005 之间发布的 Platform SDK 和 WDK 中的编译器才能找到答案。

这篇 MSDN 博客文章

_M_AMD64 和 _M_X64 是等效的。


0
投票

这个答案适用于那些关心旧版 MSVC 版本可移植性的人。

对于可移植代码,优先使用

_M_X64
而不是
_M_AMD64
虽然这两个宏在功能上等效,但
_M_AMD64
仅在 Visual C++ 2008 及更高版本中引入,而
_M_X64
是在 Visual C++ 2005(第一个版本)中引入的支持 x86-64 的 MSVC)。

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.