C++源程序迁移注意事项汇总:32位至64位,Windows平台
本文记录一下开发过程中遇到的迁移32位Windows源程序至64位Linux程序过程中的一些问题和处理经验,希望对遇到类似问题的程序猿和程序媛有帮助。
整型数据的处理
问题
对于64位计算而言,因为Windows和Linux使用的是两种不同的数据模型,即LLP64和LP64(有关信息详见64-bit computing
)。因此,在用C++编写的Windows程序中遇到需要将长整型转换为指针类型的时候,编译器会给出如下警告:
Warning C4312:“operation”: 从“type1”转换到更大的“type2”;
此警告检测将 32 位值分配给 64 位指针类型的尝试,例如,将 32 位 int 或 long 强制转换为 64 位指针。
原因即为LLP64模型中int和long整型均为32位,而 pointer 和 size_t 均为 64位,编译器认为这可能是不安全的转换,即使对于在发生符号扩展时适应 32 位的指针值也是如此。 如果为 64 位指针类型分配负 32 位整数,则符号扩展会导致指针值引用的内存地址与整数的值不同。
解决办法
使用显式定义的 int64_t 和 int32_t 数据类型,该类型在头文件< cstdint.h > 中定义,并依据ISO C99规范进行定义,可以保证整型数据类型的定义独立具体的平台,确保跨平台的兼容性和一致性。
以下是一个实际的代码例子:
.....
typedef int64_t CURSOR_TYPE;
CURSOR_TYPE cursor_type = SQL_CURSOR_DYNAMIC;
ret = SQLSetStmtAttr(this->m_hStmt, SQL_ATTR_CURSOR_TYPE,
reinterpret_cast<SQLPOINTER>(cursor_type), SQL_IS_INTEGER);
.....
《待续》