bad*_*kya 32 c++ linux portability 32bit-64bit
我有一个可以在32位机器上编译和工作的软件包.我现在正试图让它在64位机器上编译并发现以下错误 -
error: cast from ‘void*’ to ‘int’ loses precision
Run Code Online (Sandbox Code Playgroud)
是否有编译器标志来抑制这些错误?或者我是否必须手动编辑这些文件以避免这些演员表?
Ree*_*sey 50
问题是,在32位中,int(一个32位整数)将保存一个指针值.
当你移动到64位时,你不能再将指针存储在int中 - 它不足以容纳64位指针.在使用intptr_t类型设计的.
jal*_*alf 23
你的代码坏了.忽略编译器给你的警告不会破坏它.
当您尝试将64位宽指针存储为32位整数时,您认为会发生什么?一半的数据将被丢弃.我无法想象很多情况下这是正确的事情,或者它不会导致错误的地方.
修复你的代码.或者保持代码当前工作的32位平台.
如果您的编译器定义intptr_t或uintptr_t使用它们,因为它们是保证足够大的整数类型来存储指针.
如果这些类型不可用,size_t或者ptrdiff_t也足够大,可以在大多数(不是所有)平台上保持指针.或者使用long(在GCC编译器上通常是64位平台上的64位)或long long(大多数但不是所有编译器都支持C99的C99类型),或者至少64位的其他实现定义的整数类型在64位平台上广泛使用.
小智 14
我的猜测是OP的情况是void*被用作int的一般存储,其中void*大于int.例如:
int i = 123;
void *v = (void*)i; // 64bit void* being (ab)used to store 32bit value
[..]
int i2 = (int)v; // we want our 32bits of the 64bit void* back
Run Code Online (Sandbox Code Playgroud)
编译器不喜欢最后一行.
我不打算以这种方式滥用空洞来判断是对还是错.如果你真的想欺骗编译器,以下技术似乎可行,即使使用-Wall:
int i2 = *((int*)&v);
Run Code Online (Sandbox Code Playgroud)
这里它取v的地址,将地址转换为所需数据类型的指针,然后跟随指针.
sth*_*sth 11
出于某种原因这是一个错误:int只是void*你机器上的一半大,所以你不能只存储void*一个int.你会松开指针的一半,当程序稍后试图int再次指出指针时,它不会得到任何有用的东西.
即使编译器不会给出错误,代码也很可能不起作用.需要更改和检查代码以获得64位兼容性.
从可移植性的角度来看,向int转换指针是非常糟糕的.int的大小由编译器和体系结构的混合定义.这就是创建stdint.h标头的原因,允许您明确说明您在具有许多不同字长的许多不同平台上使用的类型的大小.
你最好不要转换为uintptr_t或intptr_t(来自stdint.h,并选择最符合你需要的签名的那个).
| 归档时间: |
|
| 查看次数: |
45962 次 |
| 最近记录: |