【问题标题】:getting an warning cast to pointer from integer of different size从不同大小的整数获取警告转换为指针
【发布时间】:2015-09-10 05:49:02
【问题描述】:

我目前正在从 32 位移植到 64 位。我收到了警告:

从不同大小的整数转换为指针

在下面的代码中

AcLogFileWrite(
    (FILE *) pOut->pTrace->logFileHandle, /* warning in this line */
    outRecord,
    outRecordLen);

AcLogFileWrite()的原型是

int AcLogFileWrite(
    FILE * handle,
    char * data,
    int    bytes);

这里参数pOut->pTrace->logFileHandle的类型是int

如何解决此警告?

【问题讨论】:

  • 检查 'int' 和 'FILE*' 是否具有相同的大小。可能是指针的大小是 32 位版本的两倍
  • AcLogFileWrite() 期望第一个参数为 FILE 指针,但您传递的是 int 类型。
  • 为什么它首先是int?将其更正为FILE *,或者如果你绝对必须,void *
  • logFileHandle 是如何初始化的?
  • 有什么原因logFileHandle 必须是int 类型吗?如果不是,请将其更改为FILE *。如果是这样,您必须创建一些整数到 FILE* 的映射。

标签: c++ c


【解决方案1】:

您不能在 32 位 int 中存储 64 位。如果logFileHandle 必须存储一个指针,那么唯一可以安全地做到这一点的整数类型是来自<stdint.h>uintptr_tintptr_t。或者你可以typedef void*。由于您无论如何都要移植到新的 ABI,所以二进制兼容性不是问题,现在是修复它的好时机。

如果你绝对不能从int改变类型的定义,那么你必须在ILP64模型下编译,其中intlongvoid*都是64位宽。

【讨论】:

  • 好吧 logFileHandle 在一个结构名 pTrace 中,logFileHandle 的数据类型是 int
  • 在此代码中,int 的 logFileHandle 将首先被类型转换为 FILE*,然后将传递给 FILE*
  • 但是,由于 32 位 int 不能容纳 64 位 FILE*,因此生成的指针将是垃圾,任何取消引用的尝试都会导致段错误。这就是为什么编译器会阻止你朝自己的脚开枪。
  • @newbie - 强制转换只会使编译器的警告静音。我们担心指针通常不适合int。例如,如果您有一个 64 位指针,如 00007FF625921C8F,则 32 位 int 将只存储 25921C8F。当你将它转换回指针时,你会得到0000000025921C8F
  • 所以要么typedef uintptr_t filehandle_t 要么typedef void* filehandle_t 并将类型更改为filehandle_t。或者任何符合您的命名约定的内容。
【解决方案2】:

如果logFileHandle 实际上是使用例如初始化的文件描述符open() 你想在它上面使用fdopen 并将函数的结果传递给AcLogFileWrite()

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    相关资源
    最近更新 更多