在64位构建中,我应该同时定义_WIN32和_WIN64吗?

40

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

如果没有问题,我想删除_WIN32。但我不确定是否可以这样做。
如果我删除_WIN32的定义,是否可以?


可以吗?不知道。你的目标是什么? - Oded
你只是想知道是否可以删除,但是你没有提供足够的细节说明应用程序将在哪里执行(它将在32位上运行吗?是的?还是不是?)删除解决了什么问题? - Oded
4个回答

75

_WIN32并不是你想象中的意思。它的意思是“我正在使用Windows API”。在Windows NT 3.1时代添加了32后缀以使其与Windows版本3中使用的16位API区分开来。由于位数问题,此术语已经不再流行。在stackoverflow.com上,你可以看到这一点,[win32]标签会带你进入[winapi]。

不要删除它,因为你正在使用Windows API。


56

预定义宏的文档说明:

_WIN32: 适用于 Win32 和 Win64 应用程序,总是定义。

_WIN64: 适用于 Win64 应用程序。

因此,不仅应该_WIN32总是定义,而且在64位应用程序中也不会引起任何问题。因此,我建议您不要删除它。


13

你不应该自己定义它们。

工具链(编译器 + 系统头文件)会根据需要定义它们。


我认为这在技术上是不正确的 - MSVC编译器总是定义_WIN32,除非它被告知通过其输入(例如/DWIN32选项)来定义WIN32。许多项目(告诉编译器)定义WIN32,但这是项目的决定,而不是编译器的决定。 - Spike0xff
1
@Spike0xff:很好的观点,不是所有系统宏都必须在编译器二进制文件本身中预定义。希望这个编辑能够使答案更加准确。(另一方面,问题和答案都是关于“_WIN32”而不是“WIN32”,以及关于“_WIN64”而不是“WIN64”)。 - Ben Voigt
关于楼主的观点,非常好!编辑得很棒,我改变了我的投票。顺便说一句,你的个人简介声明也很不错;-) - Spike0xff

5

_WIN32:适用于Win32和Win64应用程序,始终定义。

_WIN64:适用于Win64应用程序。

更多详细信息请参见:预定义的宏

简而言之,WIN32/_WIN32 用于判断是否使用 Windows(对于跨系统应用程序),而 _WIN64 用于告诉编译环境是 x86 还是 x64。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接