[英]Argument to function
我对这个定义为函数的参数感到困惑
int bind(int s, const struct sockaddr *name, int namelen)
并称为
bind(sd, (struct sockaddr_in *) &addr, length);
我无法解释struct sockaddr_in *
在这里的struct sockaddr_in *
。
这会工作: bind (sd, &addr, length);
?
它应该像这样调用:
bind (sd, (struct sockaddr *) &addr, length);
至于为什么,如果你看一下这些结构的定义,这就是做多态的C方式:
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
// IPv4 AF_INET sockets:
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};
// IPv6 AF_INET6 sockets:
struct sockaddr_in6 {
u_int16_t sin6_family; // address family, AF_INET6
u_int16_t sin6_port; // port number, Network Byte Order
u_int32_t sin6_flowinfo; // IPv6 flow information
struct in6_addr sin6_addr; // IPv6 address
u_int32_t sin6_scope_id; // Scope ID
};
它们都共享相同的第一个成员sa_family
当你将指针传递给其中一个结构时bind()
你首先将它转换为struct sockaddr *
并且在函数内部, sa_family
用于确定你传递的结构并将其sa_family
转换为正确的一个,而不是每个结构都有一个函数,你有一个接受sockaddr*
函数。
另一种看待它的方法,从OOP的角度来看,假设sockaddr
是sockaddr_in
和sockaddr_in6
的基类,并且将指针传递给sockaddr
类似于转换为基类型并调用泛型函数。 希望这更清楚。
除了void
指针之外,从指针T
到指向U
的指针的转换应该是显式的。
bind (sd, (struct sockaddr *) &addr, length);
这取决于addr
是什么。
如果它不是相同结构的地址,那么你需要对它进行类型转换,否则你会得到警告,从<type of addr>
到const struct sockaddr*
隐式类型转换const struct sockaddr*
查看编译器在编译任何程序时给出的所有警告消息。 开始使用它(对于编译器gcc
警告):
gcc -Wall <test.c> -o <test>
这是程序员的最佳实践。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.