我们有一个32位的Windows应用程序,它使用C ++和旧的Windows应用程序模型。技术上是否可以使用单个源并将其编译为32位和64位,方法是打开编译器开关或使用某些宏?
目前我认为代码不会编译为64位应用程序,我将不得不修复编译错误,一般情况下我应该如何继续编译,以便它编译为64位和32位应用程序。我应该记住什么?挑战是什么?任何评论和提示将不胜感激。 感谢
答案 0 :(得分:3)
编译器根据目标平台定义宏。例如,GCC定义__i386__
和__amd64__
,MSVC分别为32位和64位定义_M_IX86
和_M_X64
。例如,您可以在预处理器#ifdef
语句中使用这些宏来指导编译流程。
Pre-defined C/C++ Compiler Macros对于不同的编译器有一个很好的来源。
答案 1 :(得分:3)
关于“我应该记住什么?挑战会是什么?”这些是我在将代码从32位移植到64位时遇到的最常见问题:
确保在编译微软编译器上的/W4
或gcc上的-Wall -Wextra -pedantic-errors
时使用最严格的警告级别,以帮助捕获从较大类型到较小类型的转换。
这是Microsoft的guide用于移植,但也适用于其他编译器。
答案 2 :(得分:1)
因为我们这样做,这当然是可能的。最难的部分是 获得Visual Studio配置为x64(并不是真的 那很难)。除此之外,没什么特别的 至少,如果C ++是最干净的(即使它是 不)。完全相同的来源适用于两者;没有条件的 汇编或任何需要。
答案 3 :(得分:0)
移植时最大的问题应该是各种类型的sizeof()不同。因此,在32位上正确运行的代码片段可能会对64位产生定时炸弹效应。例如,您可以使用以下代码:
size_t sz = GetSomethingBig();
DWORD dw = (DWORD)sz;
因此,在32位时,size_t和DWORD都具有相同的大小(4个字节)。在移植版本中,size_t将是8个字节长,而DWORD仍然是相同的。由于我们进行原始C风格的类型转换,因此不会出现编译错误。并且在运行时,如果sz小于0x100000000,一切正常。所有其他值都会导致数据丢失,并且难以预测。