linux c程序如何升级,使用Linux,C ++,Kdevelop,gcc,64位应用程序升级问题

在尝试在RedHatLinux上安装新版本并运行自定义代码时,遇到从void*到int转换时精度损失的错误。这可能是由于编译器将int的默认大小从32位更改为64位导致的。解决方案包括确认编译器的整数大小,并通过适当转换(如(int32)(int64))确保数据正确传递。在不同的RedHat版本间,编译器的行为有所差异,可能需要适配代码以兼容不同版本。
摘要由CSDN通过智能技术生成

在工作中,我一直在尝试在计算机上安装新版本的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中的工作原理相同。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值