【问题标题】:problems in migrating 32bit application on 64 bit在 64 位上迁移 32 位应用程序的问题
【发布时间】:2012-04-22 06:56:48
【问题描述】:

我正在尝试使用 Visual Studio 2010 将现有的 c++ 32 代码迁移到 windows7 上的 64 代码。我以前从未进行过 64 位编译。在 Internet 参考资料的帮助下,我完成了 64 位编译的设置。像带有 64 位编译器的 VS2010 等以及其他配置更改。 在预处理器中,我删除了 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 吗?我试图通过评论这个包含,但我得到了代码中使用的 HANDLE 其他错误。 如果我去WIN32定义VS2010指向windef.h文件中的定义。此文件存在于 Microsoft SDKs\windows\v7.0A\include 文件夹中,即不是我的本地代码。 作为参考,定义如下。

#ifndef WIN32
#define WIN32
#endif

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

提前感谢您的帮助。

【问题讨论】:

标签: c++ 32bit-64bit


【解决方案1】:

你不应该自己定义。应该用来检查的宏是

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

这些由编译器定义(参见here)。

通常,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

【讨论】:

  • 我不确定我是否理解你的解释。但我没有添加_WIN64。我添加了 WIN64,因为现有代码使用的是 WIN32(两者都没有下划线),即使 windef.h 文件中的 WIN32 定义也来自 Microsoft SDK。如果我误解了您的解释,请您详细解释一下。对造成的不便表示歉意。谢谢
  • 是的,在阅读完旅游初始答案后,我编辑了如下所示的代码 #if defined _WIN32 && defined _WIN64 #error 只应定义 WIN32 和 WIN64 符号之一 #endif 我仍然遇到相同的错误。在看到您编辑的响应后还有一个查询是 x64 代码将始终定义 _WIN32 和 _WIN64。这种理解正确吗?如果是,那么在定义两者时让代码抛出错误不是正确的编码。是这样吗?
  • 实际上引发错误的代码来自第 3 方库(来自递归软件的 ospace),我不确定他们为什么不检查 _WIN32。
猜你喜欢
  • 2017-12-11
  • 2020-10-28
  • 2018-02-17
  • 2015-04-14
  • 2014-08-13
  • 2011-04-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
相关资源
最近更新 更多