【发布时间】:2016-11-12 21:48:24
【问题描述】:
为什么下面的代码会给出警告?
int main(void)
{
struct {int x; int y;} test = {42, 1337};
struct {int x; int y;} *test_ptr = &test;
}
结果:
warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
struct {int x; int y;} *test_ptr = &test;
^
【问题讨论】:
-
@Jonathan Leffler 的回答是正确的。不同类型指针之间的任何转换都会引发该警告。不幸的是,由于这两个结构都是未命名且不同的,因此您不能在它们之间进行转换。这就是为什么你应该事先声明你的结构。
-
除了其他答案,值得注意的是可以摆脱警告。只需对
void*进行中间转换:struct {int x; int y;} *test_ptr = (void*)&test; -
如果你希望它们是相同的类型,定义类型once。
-
@Radnyx:事情没那么简单。 incompatible 指针类型之间的转换(在大多数但不是所有情况下)是违反约束的,需要诊断。 (gcc 默认发出警告,这是有效的,但可能是致命错误)。类型可以兼容而不是相同的类型;还有
void*和例如int*不兼容,但可以相互分配(存在隐式转换)。
标签: c pointers struct initialization incompatibletypeerror