x64平台下指针和整数的转换

今天一个项目中一个模块需要调用正则表达式,我们采用的是比较流行的 deelx.h,但是在使用其中的 replace 功能时,在编译过程过程遇到几处 bug ,分别是:

deelx.h:3626: error: cast from ‘const char*’ to ‘int’ loses precision

deelx.h:3637: error: cast from ‘const char*’ to ‘int’ loses precision

deelx.h:3644: error: cast from ‘const char*’ to ‘int’ loses precision


刚开始没有发现太大问题,也完全忘记了当前所使用的是 x64 平台,于是在 stackoverflow 中找到了解决办法及出现 bug 的原因。

原来是 deelx.h 在 x64 平台上编译时,原先的强制转换遇到了问题,因为 x64 平台下指针类型的长度一个8 byte,而 int 类型是一个4 byte,而原始的 (int) 强制转换无法匹配8 byte的指针,需要修改为 (unsigned long) 来自适应64位的编译器,这么修改后,bug 就解决了。

其实最好的修改办法是使用 intptr_t 类型进行强制转换。

<inttypes.h> 提供的其他有用类型包括大小足以包含一个指针的带符号整数类型和无符号整数类型。这些类型以 intptr_t 和 uintptr_t 形式提供。选用 uintptr_t 类型作为指针的整数类型比使用基本类型(如 unsigned long)要好。尽管在一般平台,类型 unsigned long 与指针的长度相同,但如果使用 uintptr_t,这会使其可移植到许多其他系统中。uintptr_t 或 intptr_t 类型可以被安全的在 void * 和 整数间转换,对于写跨 64 位平台的程序非常重要。也就是说,当你需要把指针作为一个整数来运算时,转换成 uintptr_t 或 intptr_t 才是安全的,可以在运算完毕安全的转回指针类型。另外,使用 uintptr_t 进行强制类型转换通常比使用 intptr_t 安全,在进行比较时尤为安全。

x64平台下指针和整数的转换》上有2条评论

  1. 原文中”因为 x64 平台下指针类型的长度一个8bit,而 int 类型是一个4bit,而原始的 (int) 强制转换无法匹配8bit的指针“有单位错误,应为 byte ,而不是 bit

发表评论

电子邮件地址不会被公开。 必填项已用*标注