与32位和64位应用程序相同源的条件编译 我们有一个32位Windows应用程序,使用C++和良好的旧Windows应用程序模型。从技术上讲,是否可以通过打开编译器开关或使用一些宏,将单个源代码编译为32位和64位

与32位和64位应用程序相同源的条件编译 我们有一个32位Windows应用程序,使用C++和良好的旧Windows应用程序模型。从技术上讲,是否可以通过打开编译器开关或使用一些宏,将单个源代码编译为32位和64位,c++,windows,32bit-64bit,conditional-compilation,C++,Windows,32bit 64bit,Conditional Compilation,目前,我不认为该代码将编译为64位应用程序,我必须修复编译错误,一般来说,我应该如何继续,使其同时编译为64位和32位应用程序。我应该记住什么?挑战是什么?如有任何意见和提示,将不胜感激。 谢谢编译器根据其目标平台定义宏。例如,GCC分别为32位和64位定义了\uuuuui386\uuuuuu和\uuuuuAMD64\uuuuuu,MSVC分别为32位和64位定义了\uM_IX86和\uM_X64。例如,您可以在预处理器#ifdef语句中使用这些宏来指导编译流程 对于不同的编译器,有一个很好的源

目前,我不认为该代码将编译为64位应用程序,我必须修复编译错误,一般来说,我应该如何继续,使其同时编译为64位和32位应用程序。我应该记住什么?挑战是什么?如有任何意见和提示,将不胜感激。
谢谢

编译器根据其目标平台定义宏。例如,GCC分别为32位和64位定义了
\uuuuui386\uuuuuu
\uuuuuAMD64\uuuuuu
,MSVC分别为32位和64位定义了
\uM_IX86
\uM_X64
。例如,您可以在预处理器
#ifdef
语句中使用这些宏来指导编译流程


对于不同的编译器,有一个很好的源代码。

这当然是可能的,因为我们这样做了。最难的部分是 为x64配置VisualStudio(这并不是真的 这很难)。除此之外,目前没有什么特别的 至少如果C++是最干净的(甚至它是) 不)。完全相同的来源对两者都适用;无条件
编译或任何需要的东西

移植时最大的问题应该是各地不同类型的sizeof()不同。因此,在32位上正确运行的代码片段可能会在64位上造成定时炸弹效应。例如,您可以有如下代码:

size_t sz = GetSomethingBig();
DWORD dw = (DWORD)sz;
因此,在32位时,大小和DWORD这两种类型都具有相同的大小(4字节)。在移植版本中,大小为8字节,而DWORD仍然相同。正如我们进行原始C风格的类型转换一样,不会出现编译错误。在运行时,如果sz小于0x100000000,则一切正常。所有其他值都将导致数据丢失,影响难以预测。

关于“我应该记住什么?挑战是什么?”这些是我在将代码从32位移植到64位时遇到的最常见问题:

  • 假设指针是4字节
  • 假设sizeof(int)=sizeof(指针)
  • 假设sizeof(int)=sizeof(size\u t)
  • 内嵌/硬编码x86程序集
确保在编译时使用最严格的警告级别(microsoft编译器上的
/W4
,或gcc上的
-Wall-Wextra-pedantic errors
),以帮助捕获从较大类型到较小类型的转换


以下是Microsoft的移植指南,但也适用于其他编译器。

您的问题太广泛了。要回答第一个问题,可以使用编译器标志打开64位或32位的编译。标志是什么以及如何传递标志取决于编译器。这实际上取决于应用程序对特定于硬件的代码以及它与其他二进制文件共享的任何表面区域所做的操作。但为什么需要它们呢?@JamesKanze compiler macros通常是为32/64位平台定义的宏?。。例如,如果我想使用一些内联汇编程序呢?特别是32/64位宏。(对于内联汇编程序:Microsoft 64位编译器中没有任何编译器。)好吧,谢天谢地,我们并不局限于Microsoft编译器;)。但对于微软来说,如果我想使用一些函数来填充结构,比如堆栈跟踪,该怎么办?体系结构是可靠的。大部分依赖于体系结构的内容应该在一个单独的模块中,您可以通过传递给编译器的路径和文件名来选择正确的实现,而不是通过
#ifdef
等。感谢您的回复和移植指南。