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

标签 c++ visual-c++ macros built-in

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

_M_AMD64 Defined as the integer literal value 100 for compilations that target x64 processors. Otherwise, undefined.

_M_X64 Defined as the integer literal value 100 for compilations that target x64 processors. Otherwise, undefined.

此外,还有下面的宏似乎做同样的事情?

_WIN64 Defined as 1 when the compilation target is 64-bit ARM or x64. Otherwise, undefined.

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

最佳答案

_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 又名 Intel 64)的 CPU,而 Itanium 现在几乎已经死了。

您仍然会在某些地方和文件名中看到 AMD64 名称,但现在很多人只称它为 x64 或 x86-64。

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

This MSDN blog post

_M_AMD64 and _M_X64 are equivalent.

关于c++ - MSVC 内置宏 _M_AMD64 和 _M_X64 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42550334/

相关文章:

每行视觉选择上的 Vim 宏

c++ - G++ 是否足够聪明来优化它?

c++ - 如果使用预定义的 map ,重建项目需要非常长的时间?

c++ - 如何在运行时生成函数?

C++类继承(游戏结构)

c++ - 判断一个lib文件是否为2010 Build

macros - 使用 Racket 生成日志信息

java - 在 Java 中实现与 C++ 中的析构函数相同的结果

c++ - 使用 g++ 从 g++ 和 gfortran 链接 .o 文件时出现 "__gfortran_pow_c8_i4"错误

c++ - 不明白这个错误信息