最近有系统从32位平台移植到64位平台。遇到了很多问题。这里简单的记录一下:
更大的Struct
很明显,当平台换成64位之后,struct就有可能按照8字节来对齐了。这就导致了Struct的大小会有一定的增大。特别是当struct中又包含有struct的时候。这就要小心我们是否有对数组的地址做类型的强制转换成struct。
危险的强制类型转换
在32位平台上,指针类型也是32位的。所以我们有可能会定义一个32位长度的变量,例如:U32类型。然后把这个U32类型的变量当做指针来用。但是在64位平台上,很显然,指针类型是64位的,这样的强制使用U32类型的变量当做指针来用的方法就不可行了。U32变量中保存的地址就是个错误的地址,只有低32位!宕机就很显然了。更加危险的是,这样的强制类型转换是在我们的代码中显式申明的,编译器不会给出Warning!很难找到所有这样的错误代码!
缺失的函数申明
我们的函数定义在不同的文件中,在使用的地方有的时候没有include头文件。这个时候编译器会给我们一个Warning。很多时候这样的Warning并不会造成太大的问题。但是在32位到64位的移植过程中,有一类问题会导致错误:如果这个函数返回的是个64位的值,例如指针。但是使用的地方没有申明,会发生什么呢?编译器会默认认为这个函数的返回值是个32位的值。所以在调用的地方只会返回32位。
设想一下,如果你的函数是返回一个指针,调用的地方也确实是给这个函数的返回值赋值给了一个指针类型的值,但是这个指针的值就是不对,他只有低32位有值,高32位为0!