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

.....

《待续》


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值