64位Windows平台中的WIN32预处理器定义

Ami*_*tav 9 64-bit visual-studio-2010 visual-c++

我们是否应该在将Visual 2012 C++项目迁移到目标64位平台时将预处理器定义从WIN32更改为WIN64.

现在我用以下settigns建立了这个项目

  • MACHINE(指定目标平台)设置为/MACHINE:X64.

  • 目标环境设置为 /env x64

  • 在C/C++项目设置 - >代码生成,结构成员Allignment到8 BYtes

请指导我应该改变哪些项目设置.

Gre*_*ran 6

区分这些预处理器定义的下划线版本和非下划线预处理器定义非常重要。

下划线版本_WIN32和_WIN64是与VC ++运行的计算机的实际物理CPU相关的内置程序。在32位计算机上,将始终定义_WIN32(用户不需要定义它),但不会定义_WIN64。在64位计算机上,将始终定义_WIN64,也可以定义_WIN32,但是代码可以依靠_WIN64来确定计算机是否为64位。

非下划线版本与编译代码所针对的目标有关。例如,定义WIN32(例如cl.exe ... / D WIN32 ...)会使VC ++编译32位体系结构的代码,但是由于64位,该代码当然也将在物理64位CPU上运行CPU向后兼容32位代码。但是请注意,本身没有WIN64定义(有_WIN64但没有WIN64)。这是有道理的,因为假定您在32位计算机上运行Visual C ++。在这种情况下,为64位计算机编译的代码将无法运行。

因此,总而言之,_WIN32和_WIN64是内置的(用户未定义)。WIN32是由用户在为32位编译时定义的,而不是在为64位编译时定义的。如果在64位计算机上运行Visual Studio并选择Win32 vs x64构建配置,您会注意到WIN32是为Win32构建配置定义的,但没有为x64构建配置定义的。如今,大多数计算机都是64位的,因此大多数开发人员可以选择仅支持x64,并且在编译时就永远不定义WIN32(除非他们知道他们出于特定目的(例如特定的或晦涩的API)需要使用WIN32)仍然希望支持较旧的32位计算机)。


小智 4

您是指 _WIN32 和 _WIN64 宏吗?如果您正确指定了所有参数(请参阅 PS),则无需更改代码。在 64 位解决方案中,必须同时定义 _WIN32 和 _WIN64。_WIN32 宏指定您可以使用 Win32 API,_WIN64 宏指定针对 64 位模式进行编译。您还可以对 Itanium (_M_IA64) 和 x86-64 (_M_AMD64) 使用不同的宏。详细信息请参阅MSDN

PS 你是手动选择平台参数吗?您可以通过VS指定它:

  1. 构建菜单 -> 配置管理器。
  2. 在 Active Solution Platform 中选择新建。
  3. 键入或选择新平台 -> x64,然后单击“确定”。
  4. 现在在“平台”行中您可以简单地选择 x64。