我正在查看 MSVC 文档中的内置宏,并看到以下宏:
_M_AMD64 定义为针对 x64 处理器的编译的整数文字值 100。否则,未定义。
_M_X64 定义为针对 x64 处理器的编译的整数文字值 100。否则,未定义。
另外,下面的宏似乎也有同样的作用?
_WIN64 当编译目标为 64 位 ARM 或 x64 时定义为 1。否则,未定义。
根据文档,它们具有完全相同的定义 - 它们等效吗?是否存在其中一个被定义而另一个没有被定义的情况?如果不是,这里的历史是什么?
_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 中的编译器才能找到答案。
_M_AMD64 和 _M_X64 是等效的。
这个答案适用于那些关心旧版 MSVC 版本可移植性的人。
对于可移植代码,优先使用
_M_X64
而不是 _M_AMD64
。 虽然这两个宏在功能上等效,但 _M_AMD64
仅在 Visual C++ 2008 及更高版本中引入,而 _M_X64
是在 Visual C++ 2005(第一个版本)中引入的支持 x86-64 的 MSVC)。
参考资料: