在C中将32位应用程序转换为64位应用程序

Cha*_*oin 20 c x86 x86-64

我目前正致力于将32位应用程序转换为C语言中的64位应用程序.此应用程序目前正在开发x86架构(Windows,osx,Unix,Linux).因此,在开始编码之前,我想知道在转换应用程序时我需要考虑什么.

geo*_*car 27

  1. 找出谁写了它.他们是白痴吗?他们是从几年前?你能问他们问题吗?他们熟悉多平台和系统的存在吗?了解程序作者的思维方式将帮助您在遇到问题时理解问题.
  2. 启动并运行64位计算机/构建环境.
  3. 用int替换long.要完全清楚这LONG不是long.
  4. 更换(int)&x管型和打字intptr_t(unsigned int)&x使用uintptr_t
  5. 审核任何依赖于强制转换结构的东西,char*用它来做指针算术.
  6. 如果你假设,正则表达式搜索\ <4 \> 4 = sizeof(void*)
  7. 耐心点.当您发现问题时,请查看是否存在相同问题的其他地方,并将解决方案包装在宏中.
  8. 尽量不要使用#ifdef RUN64或类似的东西.如果128位平台变得流行,你会后悔的.
  9. 根据某些集中式宏来封装所有更改,这些宏将隐藏程序中其他位置的可移植性差异.
  10. 使用覆盖测试仪来确保您已覆盖所有内容(如果适用)

编辑添加了uintptr_t注释建议的注释.

  • 使用uintptr_t而不是intptr_t.你不需要地址上的标志. (2认同)

Nor*_*sey 8

尚未提到的一个潜在问题是,如果您的应用程序从磁盘读取或写入二进制数据(例如,使用读取结构数组fread),您将不得不非常仔细地检查并且可能最终有两个读取器:一个用于遗留文件和一个64位文件.或者,如果你小心使用类型,如uint32_t从等<stdint.h>头文件,你可以重新定义你的结构是位对位兼容.无论如何,二进制I/O是值得注意的.


Chr*_*oph 5

如果您为您的值使用了正确的类型 - 例如。size_t, ptrdiff_t, uintptr_t,stdint.h适当的固定大小的 int 类型- 并且没有对值大小进行硬编码,您的代码应该开箱即用。


CB *_*ley 5

这实际上取决于应用程序及其编码方式.有些代码可以用64位编译器重新编译,它只会工作,但通常只有在代码设计时考虑了可移植性时才会发生这种情况.

如果代码有很多关于本机类型和指针大小的假设,如果它有很多位打包或使用字节指定的协议与外部进程对话但是使用一些关于本机类型大小的假设那么可能需要一些或大量的工作才能获得干净的编译.

几乎每个演员和编译器警告都是需要签出的红旗.如果代码不是"警告干净",那么这也表明可能需要做很多工作.