在工作中,我一直在尝试在计算机上安装新版本的Red Hat Linux,更重要的是,运行自定义的代码。 进行此升级时,我注意到以下错误:
cast from 'void*' to 'int' loses precision
另外,我注意到基于库的其他错误字符串,该错误强制使用32位地址。 它们似乎是由于将类型强制转换为自定义库的32位值而导致的。
底线是这个。 我相信编译器已将int的默认大小从32位更改为64位。 我试图找出是否是这种情况,而无需编写琐碎的程序来确定整数的大小。 另外,是否有办法至少将大小强制回32位(至少作为概念证明)?
"我试图找出这种情况,而无需编写一个琐碎的程序来确定整数的大小。" 我谨建议您编写一个简单的程序来确定整数的大小(并确定void*的大小)。
如果您使用的是x86_64框,则int仍为4个字节。如果是8,则编译器不会告诉您
cast from 'void*' to 'int' loses precision
因为不会失去精确度。这说明您试图将8byte指针塞入4byte int的过程很显然会丢失一些信息。
而且,这只是一个旁注,编写这篇文章有多难?
#include
#include
#define sz(t) std::cout << sizeof(t) << '
'
int
main(void)
{
sz(char);
sz(int);
sz(long);
sz(void*);
return 0;
}
使用-m32 gcc开关。
尝试编译此:
#include
int main(){
long z;
printf("size is %ld
", sizeof(z));
return 0;
}
使用-m32,您应该得到4,使用-m64,您应该得到8。
但是他的编译器抱怨从void*到int的转换,而不是从void*到long的转换。 我认为可以安全地假设他在x86_64机器上,int是32位,void*,开始是64位指针。
@justsomebody:我只是回答有关如何强制编译器以32位模式进行编译的问题。 我在示例中使用了long,因为这样他可以轻松地确认其编译器默认使用的内容-在64位计算机上,long将是8。
@ChrisDodd:ideone.com/UymsS。 我还使用-m32在我的64位计算机上进行了测试,它也给出了4。
经过大量的辛苦工作,我得以弄清楚以下几点。
由于寻址空间的技巧,我之前的代码需要从内存中的指针获取32位自定义整数。最重要的是,Redhat 4中的编译器允许它,但在Redhat 5中不允许。解决方案是先将其转换为64位标准整数,然后转换为32位,如(int32)(int64)some_pointer_value所示。我找不到更好的解决方案,但这似乎可行。
有一些带有长案例的switch语句。新的编译器似乎不喜欢这样。快速重新排列代码似乎可以解决此问题。
intptr_t技巧非常有效。
有一些像class_name::function1(){...}这样声明的类函数。我想我一定是从花药编程语言中养成了这个习惯。 class_name::必须执行,但是一旦执行,代码就会编译。
一旦完成所有这些操作,即可编译代码。此外,它在Redhat 4中的工作原理相同。