关于linux代码中的一个疑问
在看linux关于TCP/IP代码的时候在void tcp_init_sock(struct sock *sk)函数下面发现这样一条赋值语句:
struct inet_connection_sock *icsk = inet_csk(sk);
struct tcp_sock *tp = tcp_sk(sk);
static inline struct inet_connection_sock *inet_csk(const struct sock *sk)
{
return (struct inet_connection_sock *)sk;
}
疑问在于sk和inet_connection_sock根本就不是同一个结构体,且SK也不包含inet_connection_sock结构体,为啥指针可以这样赋值?
[解决办法]
没读过代码,不过八成是确定布局了……
找了下声明果然如此:struct inet_connection_sock的第一个成员类型是struct inet_sock;struct inet_sock的第一个成员是sock。看名字就能猜出来是poor man's inheritance嘛。
PS.
C语言中:
初始化不是赋值;
声明不是语句。
[解决办法]
typedef struct
{
int a;
char b;
}inet_connection_sock;
typedef struct
{
int a;
char b;
char c;
}sock;
这种情况就可以把sock类型的结构体赋给inet_connection_sock