gpt4 book ai didi

c - 函数参数

转载 作者:太空狗 更新时间:2023-10-29 17:23:02 27 4
gpt4 key购买 nike

我对定义为函数的这个参数感到困惑

int bind(int s, const struct sockaddr *name, int namelen)

并称为

bind(sd, (struct sockaddr_in *) &addr, length);

我无法解释 struct sockaddr_in * 在这里的意思。

这行得通吗:bind (sd, &addr, length);

最佳答案

应该这样调用:

bind (sd, (struct sockaddr *) &addr, length);

至于为什么,这是C的做法polymorphism ,如果您查看这些结构的定义:

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
};

当您将指向其中一个结构的指针传递给 bind() 时,它们都共享相同的第一个成员 sa_family 您首先将其转换为 struct sockaddr * 并且在函数内部,sa_family 用于确定您传递了哪个结构并将其转换回正确的结构,而不是每个结构都有一个函数,您只有一个函数接受 sockaddr*.

另一种看待它的方式,从 OOP 的角度,想象 sockaddrsockaddr_insockaddr_in6 的基类,并通过指向 sockaddr 的指针类似于转换为基本类型并调用泛型函数。希望这能让它更清楚。

关于c - 函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13333369/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com