c/c++语言开发共享如何解决:在C代码中“从不同大小的整数转换为指针”警告?

我正在从遗留代码中删除gcc警告。

是否可以通过类型转换抑制警告“从不同大小的整数转换为指针”:

example: some_struct *ptr = func() // func() returns an integer. 

有人可以指导我如何解决这样的gcc警告吗?

    首先,如果你可以修复func (允许修改它的源),那么修复它。 如果它的计算可以用指针完成,那么用指针和返回指针来完成它们。 有时有正当理由将地址用作整数(例如,处理特殊代码中的对齐问题)。 在这种情况下,更改func以使用uintptr_t类型(在stdint.h定义)。 它被设计用于在必要时将指针视为整数。 (如果签名算术由于某种原因更好,也有intptr_t ,但我通常发现无符号uintptr_t不那么麻烦。)最好, func应该在返回时将uintptr_t为指针,因此func的返回类型将是指针(某些东西,也许是some_structvoid )。

    如果你无法修复func ,那么你可以使用强制转换来告诉编译器你打算进行正在执行的转换。 但是,此特定错误消息告诉您,您不仅仅是将整数转换为指针,而是将一个大小(例如,四个字节)的整数转换为另一个大小的指针(例如,八个字节)。 这个代码最初可能是为一个系统编写的,其中func返回的整数类型与指针类型的大小相同,但是您现在正在编译指针类型大于或小于整数大小的系统。

    在这种情况下,您必须确保func执行的计算在新架构中有效。 如果它只返回32位值,那么它总是保持正确的值吗? 也就是说,丢失的高32位不会丢失任何东西? func应该计算的地址是否超过它使用的整数类型的最大值? 如果func使用有符号整数类型,也请考虑符号位。

    如果确保func返回的值正确,则可以使用显式强制转换,例如: some_struct *ptr = (some_struct *) (intptr_t) func();

    我的gcc没有给出你引用的警告。 这也很奇怪,因为代码中没有强制转换。

    我收到了警告

     assignment makes pointer from integer without a cast 

    注意“没有演员”部分。 因此,您可以通过强制转换使gcc静默(不改变行为):

     some_struct *ptr = (void*)func(); 

    然后,如果func的返回类型不适合地址,您将收到警告(“从不同大小的整数转换为指针”)。 这可以通过额外地将func()转换为合适的整数类型来沉默,例如intptr_t

     some_struct *ptr = (void*)(intptr_t)func(); 

    所有这些都假设你真的想要将错误大小的整数转换为指针。 也许,重新编写代码是一个更好的主意。

    这里有两种可能性:

    在第一种情况下,如果int小于数据指针的大小,那么来自func的返回值将丢失信息 ,并且可能崩溃或更糟,这将在大多数64位内存模型 (包括Windows和Linux)上。 在这种情况下,您应该将func的返回类型更改为intptr_t ; 请参阅使用intptr_t而不是void *? 和为什么/何时使用`intptr_t`在C中进行类型转换? 。

    在第二种情况下,它不是一个问题,而是处理你应该通过intptr_t字节序问题: some_struct *ptr = (some_struct *)(intptr_t)func(); 以后int value = (int)(intptr_t)ptr; 。 有关该问题的讨论,请参阅GLib类型转换宏 。

    需要了解更多c/c++开发分享如何解决:在C代码中“从不同大小的整数转换为指针”警告?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享如何解决:在C代码中“从不同大小的整数转换为指针”警告?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979049.html

      (0)
      上一篇 2021年12月12日
      下一篇 2021年12月12日

      精彩推荐