我应该在 64 位版本中同时定义 _WIN32 和 _WIN64 吗?

Posted

技术标签:

【中文标题】我应该在 64 位版本中同时定义 _WIN32 和 _WIN64 吗?【英文标题】:Should I define both _WIN32 and _WIN64 in 64bit build? 【发布时间】:2011-10-04 11:55:27 【问题描述】:

当我们从已经存在的 32 位项目中添加 64 位配置时,Visual Studio 默认会复制 32 位配置。 VS 甚至复制 _WIN32 我所有的 64 位项目现在也定义了 _WIN32,尽管它们(64 位 PE)永远不能在 32 位 Windows 上运行。这对我来说很不舒服。

如果没有任何问题,我想删除 _WIN32。我不确定。 如果我删除 _WIN32 定义可以吗?

【问题讨论】:

可以吗?不知道。你的目标是什么? 您只想知道是否可以删除,但您没有提供有关应用程序应该执行的位置的足够详细信息(它会在 32 位上运行吗?是吗?不是吗?)什么问题删除会解决吗? 【参考方案1】:

_WIN32 并不代表你认为的那样。这意味着“我正在使用 Windows API”。 32 后缀是在 Windows NT 3.1 时代添加的,以使其与 Windows 版本 3 中使用的 16 位 API 不同。由于位数问题,这个术语已经失宠。你可以在 ***.com 看到这个,[win32] 标签带你到 [winapi]。

不要删除它,您正在使用 Windows API。

【讨论】:

【参考方案2】:

predefined macros 的文档说:

_WIN32: 为 Win32 和 Win64 的应用程序定义。始终定义。

_WIN64:为 Win64 应用程序定义。

所以不仅应该定义_WIN32always,它不会在 64 位应用程序中造成任何问题。因此,我建议您不要删除它。

【讨论】:

【参考方案3】:

你不应该定义它们中的任何一个。

工具链(编译器 + 系统头文件)将酌情定义它们。

【讨论】:

我认为这在技术上是不正确的——MSVC 编译器总是定义 _WIN32,它不定义 WIN32,除非它的输入告诉它,例如/DWIN32 选项。许多项目(告诉编译器)定义 WIN32,但这是项目的决定,而不是编译器的决定。 @Spike0xff:好点,并非所有系统宏都必须在编译器二进制文件本身中预定义。希望此编辑使答案更准确。 (另一方面,问题和答案是关于_WIN32而不是WIN32,关于_WIN64而不是WIN64 关于 OP 的好点子!很棒的编辑,我推翻了我的投票。 (顺便说一下你的个人资料声明中的道具 ;-)【参考方案4】:

_WIN32:为Win32和Win64的应用程序定义。始终定义。

_WIN64:为Win64应用定义。

更多详情:Predefined Macros。

简单来说,WIN32/_WIN32是用来判断你使用的是Windows(跨系统应用),_WIN64是用来判断编译环境是x86还是x64。

如果您想知道您的应用程序是否在 Windows x64 下运行,您应该使用 Windows API IsWow64Process 。

【讨论】:

以上是关于我应该在 64 位版本中同时定义 _WIN32 和 _WIN64 吗?的主要内容,如果未能解决你的问题,请参考以下文章

64位 regsrv win10_Regsvr32 在64位机器上的用法

64位 regsrv win10_Regsvr32 在64位机器上的用法

_WIN64 未在 x64 项目中定义

如何在同时拥有 64 位和 32 位版本的同时安装 64 位软件包?

请问win7系统64位应该下载哪个版本的mysql?下图这些有啥区别?

Delphi:如何确定应用程序是不是在 Win32 / Win64 下运行并在 64 位上自动启动 64 位版本?