我正在写一个套接字程序,我把struct sockaddr_in
错误地输入为struct sockaddrr_in
(注意一个额外的r
),但是我没有收到任何编译器错误,只有incompatible-pointer-types
警告。
下面是一个最小的可重复程序来演示这个问题。
#include <stdio.h>
struct Addr {
int flat_no;
};
struct Person {
struct Addr *address;
};
int main()
{
struct Person p;
struct Addr addr;
p.address = &addr;
struct Person *ptr = &p;
struct Addr *a = (struct Addrr *)ptr->address; // struct Addr mistyped as Addrr
printf("no error!!");
}
gcc
和clang
都生成此警告:
<source>:20:22: warning: initialization of 'struct Addr *' from incompatible pointer type 'struct Addrr *' [-Wincompatible-pointer-types]
20 | struct Addr *a = (struct Addrr *)ptr->address;
| ^
由于struct Addrr
在程序中从未定义过,编译器如何能够解决错误的符号?将ptr->address
类型转换为未定义的类型struct Addrr
会产生什么影响?
2条答案
按热度按时间aiqt4smr1#
因为这个类型转换是
struct Addrr
第一次出现,所以它就像一个声明,这个类型是不完整的,因为它没有定义,但是你仍然可以创建一个指向不完整类型的指针。因此,当您收到关于在不兼容的指针类型之间转换的警告时,您不会收到关于其他类型的错误。
0x6upsns2#
强制转换运算符按以下方式定义
struct Addrr *
是一个指针类型。指针类型总是完整类型。虽然被指向的类型struct Addrr
是一个不完整类型。