繁体   English   中英

争论功能

[英]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的角度来看,假设sockaddrsockaddr_insockaddr_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM