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

时间:2013-06-29 12:47:02

标签: visual-studio-2010 visual-c++ 64-bit

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

现在我用以下settigns构建了项目

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

  • 目标环境设置为/env x64

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

请指导我应该更改的其他项目设置。

2 个答案:

答案 0 :(得分:5)

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

下划线版本_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)需要它)仍然希望支持较旧的32位计算机。

答案 1 :(得分:2)

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

P.S。您是否手动选择平台参数?你可以通过VS指定它:  1.构建菜单 - >配置管理器。  2.在Active Solution Platform中选择New。  3.输入或选择新平台 - > x64并单击“确定”。  4.现在在“平台”行中,您可以简单地选择x64。