【问题标题】:Upgrading woes with Linux, C++, Kdevelop, gcc, 64 bit application使用 Linux、C++、Kdevelop、gcc、64 位应用程序升级问题
【发布时间】:2012-07-10 04:48:23
【问题描述】:

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

从 'void*' 转换为 'int' 会丢失精度

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

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

【问题讨论】:

  • "我正在尝试确定是否是这种情况,而无需编写一个简单的程序来确定整数的大小。" 我恭敬地建议您编写一个简单的确定整数大小的程序(以及void*)。

标签: c++ linux gcc casting


【解决方案1】:

如果您在 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;
}

【讨论】:

    【解决方案2】:

    使用-m32 gcc 开关。

    尝试编译这个:

    #include <stdio.h>
    int main(){
        long z;
        printf("size is %ld\n", 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。我还在我的 64 位机器上使用 -m32 进行了测试,它也给出了 4
    【解决方案3】:

    经过一番辛劳,我终于弄明白了。

    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 中也同样有效。哇!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      相关资源
      最近更新 更多