【问题标题】:Is it possible for _M_X64 to be unset on a x64 processor?_M_X64 是否可以在 x64 处理器上取消设置?
【发布时间】:2012-08-24 13:04:58
【问题描述】:

Visual Studio 编译器(2005 到 2008)为 x86/x64 位环境定义了四个宏。参考Predefined Macros

  • _M_X64 为 x64 处理器定义。
  • _M_IX86 为 x86 处理器定义。有关详细信息,请参阅下表 _M_IX86 的值。这不是为 x64 处理器定义的。
  • _WIN32 为 Win32 和 Win64 的应用程序定义。始终定义。
  • _WIN64 为 Win64 应用程序定义。

现在在 x32 位机器上永远不会设置 _M_X64。在 64 位机器上,如果您在 32 位环境上构建,_M_X64 将被取消设置,_M_IX86 将被定义。无论 32/64 位版本如何,总是定义 _WIN32。

在所有 x64 处理器中,_M_X64 是否有特殊意义?当target为x64时,会不会出现_M_X64未定义的情况?

【问题讨论】:

  • 这些宏是否依赖于编译器运行的机器?还是取决于编译程序将运行的目标?这很重要,因为我不明白您的陈述“现在在 x32 位机器上”。恕我直言,这些宏只依赖于 target。而且你可以在 32 位系统上编译 64 位目标,正如相反的情况一样..
  • @DidierTrosset:如果我没记错的话,32 位机器 (x32) 无法为 64 位目标构建程序,所以我相信在此类机器上 _M_X64 将始终未定义。
  • @Abhijit:32 位系统可以轻松构建 64 位代码。而且我这里的 64 位笔记本电脑可以为至少六种不同的处理器架构(PPC、PPC64、i386、x86_64、ARMv6 和 ARMv7)构建代码。构建系统的架构与生成的代码。

标签: c++ windows visual-studio


【解决方案1】:

现在在 x32 位机器上永远不会设置 _M_X64

这不是它的工作原理。您使用的编译器为特定的目标架构生成代码,它不关心 您的 机器。在 32 位机器上生成 x64 代码是非常可能的,MSVC 包含一个可以在 32 位操作系统上运行并生成 x64 代码的交叉编译器。它有一个 64 位编译器,可以生成 x64 代码。 IDE 设置为实际使用交叉编译器,无论您的操作系统如何。

你可以看到这些编译器安装在你的机器上,VS安装目录的vc\bin子目录。该目录包含生成 x86 代码的 32 位编译器。 x86_amd64 子目录有一个生成 x64 代码的 32 位编译器。 amd64 子目录有一个生成 x64 代码的 64 位编译器。如果您有 ARM 内核的编译器,则可能存在其他目录。总是交叉编译器。

您询问的宏名称是预定义的宏,完整列表is here。 _M_X64 宏始终由生成 x64 代码的任何编译器定义。

【讨论】:

  • 非常感谢您的解释。这让我想知道“如果它可能在 64 位机器(64 位处理器和 64 位操作系统)上,以 64 位处理器(_M_X64 已定义)构建 32 位构建(_WIN64 未定义)
  • 您只需使用 32 位编译器即可生成 x86 代码。 _M_X64 当然不会被定义。听起来您仍在将运行编译器的机器与目标体系结构混为一谈。专注于“它不关心你的机器”。
猜你喜欢
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
相关资源
最近更新 更多