在 64 位上迁移 32 位应用程序时出现问题

problems in migrating 32bit application on 64 bit

本文关键字:应用程序 问题 迁移      更新时间:2023-10-16

我正在尝试使用 Visual Studio 2010 将现有的 c++ 32 代码迁移到 Windows7 上的 64 代码。 在互联网参考的帮助下,我完成了64位编译的设置。 如VS2010与64位编译器等和其他配置更改。在预处理器中,我删除了 WIN32 并添加了 WIN64。我还有一些其他的预处理器,如OS_WIN_32和其他一些在我的代码中特定的预处理器。在使用 WIN32 的代码中,我添加了额外的条件为 ||WIN64 这只是为了确保应用程序应该使用 win32 和 win64 进行编译。当我尝试编译代码时,我收到编译错误,说

致命错误 C1189:#error:只应定义 WIN32 和 WIN64 符号之一

此错误来自本地代码,我们在其中检查是否同时定义了 WIN32 和 WIN64。 该代码如下所示。

#if defined WIN32 && defined WIN64
# error Only one of the WIN32 and WIN64 symbols should be defined
#endif

在VS2010中,如果未启用宏,则宏中的代码将灰显。 在我的代码中,上述错误也显示为灰色。 但我仍然收到该错误。

我添加 WIN64 的代码包括 windows.h. 供参考,如下所示。

#if defined WIN32 || defined WIN64
#include <windows.h>
#include <process.h>
#endif

所以我的问题是为什么我会收到此错误? 我们不应该为64位编译添加Windows.h吗? 我尝试通过评论此包含来评论此包含,但是我遇到了代码中使用的其他错误wrt HANDLE。如果我转到WIN32定义,VS2010指向windef.h文件中的定义。此文件存在于Microsoft SDK\windows\v7.0A\include 文件夹中,即不是我的本地代码。作为参考,该定义如下。

#ifndef WIN32
#define WIN32
#endif

所以我想知道为什么编译器同时获得预处理器 WIN32 和 WIN64。

提前感谢您的帮助。

你不应该自己定义。应该用于检查这一点的宏是

_WIN32 // always defined for Windows apps
_WIN64 // only defined for x64 compilation

这些由编译器定义(请参阅此处)。

通常,IDE 会将不带前缀的宏添加到命令行中,以免使用未记录的无前缀版本的旧项目无法生成。当存在记录在案的替代方案时,它们工作的事实并不是使用它们的理由。


它归结为:

#ifdef _WIN32
  // We're on Windows, yay!
#ifdef _WIN64
  // We're on x64! Yay!
#else // _WIN64
  // We're on x86 (or perhaps IA64, but that one doesn't matter anymore). Yay!
#endif // _WIN64
#else // _WIN32
  // We're not on Windows, maybe WindowsCE or WindowsPhone stuff, otherwise some other platform
 #endif