C++源程序迁移注意事项汇总【之一】

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(cursor_type), SQL_IS_INTEGER);

.....

《待续》


你可能感兴趣的:(C/C++一般话题)