我从一个旧的代码去除GCC警告。
是否有可能通过抑制铸字“转换为指针从大小不同的整数”警告:
example:
some_struct *ptr = func() // func() returns an integer.
是否有人可以指导我如何解决这样的GCC警告?
我从一个旧的代码去除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_struct
或void
)。
如果你不能修复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();
所有这一切的假设下,你真的想错了大小的整数转换为指针。 也许,返工的代码是一个更好的主意。
这里有两种可能性:
func
是铸造的实际指针的整数; 它后来被用作一个指针。 func
返回了被存储在一个指针的整数; ptr
稍后强制转换为整数,并用作一个整数。 在第一种情况下,从返回值func
会丢失信息 ,并有可能导致崩溃或更糟,如果int
比数据指针,这将是对大多数规模较小的64位内存模型 (包括Windows和Linux)。 在这种情况下,你应该改变的返回类型func
来intptr_t
; 看到使用的,而不是无效使用intptr_t *? 和为什么/时,使用类型强制转换`intptr_t`用C? 。
在第二种情况下,这是少,但对付你应该通过投排列顺序问题一个问题的intptr_t
: some_struct *ptr = (some_struct *)(intptr_t)func();
后来int value = (int)(intptr_t)ptr;
。 见GLib的类型转换宏对这一问题的讨论。