Linux、C++、Kdevelop、gcc、64位应用程序的升级难题

Upgrading woes with Linux, C++, Kdevelop, gcc, 64 bit application

本文关键字:难题 应用程序 64位 C++ Kdevelop gcc Linux      更新时间:2023-10-16

在工作中,我一直在尝试在计算机上安装新版本的Red Hat Linux,更重要的是,运行自定义代码。当我进行此升级时,我注意到以下错误:

从"void*"强制转换为"int"会丢失精度

此外,我还注意到一个库中的一系列其他错误,这些错误强制使用32位地址。它们似乎是从本质上类型转换为自定义库的32位值的结果。

底线是这样的。我相信编译器已经将int的默认大小从32位更改为64位。我试图弄清楚是否是这种情况,而不需要编写一个简单的程序来确定整数的大小。此外,是否有一种方法可以将大小强制恢复到32位,至少作为概念验证?

如果您在x86_64机箱上,int仍然是4个字节。如果是8,编译器不会告诉你

cast from 'void*' to 'int' loses precision

因为不会失去精确性。它告诉你的是,你试图把一个8字节的指针塞进一个4字节的int,这显然会丢失一些信息。

而且,这只是一个旁注,写这篇文章有多难?

#include <ostream>
#include <iostream>
#define sz(t) std::cout << sizeof(t) << 'n'
int
main(void)
{
  sz(char);
  sz(int);
  sz(long);
  sz(void*);
  return 0;
}

使用-m32 gcc开关。

尝试编译这个:

#include <stdio.h>
int main(){
    long z;
    printf("size is %ldn", sizeof(z));
    return 0;
}

使用-m32,您应该得到4,使用-m64,您应该获得8

经过大量的努力,我能够弄清楚以下内容。

  1. 由于寻址空格的技巧,我以前的代码需要从内存中的指针中获得一个32位的自定义整数。最重要的是,Redhat 4中的编译器允许它,但在Redhat 5中不允许。解决方案是首先将其转换为64位标准整数,然后转换为32位,如(int32)(int64)some_pointer_value。我找不到更好的解决方案,但这似乎奏效了
  2. 有几个switch语句的大小写很长。新编译器似乎不喜欢那样。快速重新排列代码似乎可以解决问题
  3. intptr_t技巧效果很好
  4. 有几个类函数是像class_name::function1(){...}一样声明的。我想我一定是从另一种编程语言中养成了这个习惯。class_name::不得不退出,但一旦退出,代码就编译了

一旦我做了所有这些事情,代码就编译了。此外,它在Redhat 4中也起到了同样的作用。哇!