c - 理解代码: function in struct时出现问题

标签 c struct

我从这里得到了以下代码:C - function inside struct 。我已经看了一个小时了,但我就是不明白。从第一行开始:我知道

typedef struct client_t client_t;

但是额外的*pno是如何工作的,它在做什么?为什么next从未被使用过? *self 从哪里来?

typedef struct client_t client_t, *pno;
struct client_t
{
        pid_t pid;
        char password[TAM_MAX]; // -> 50 chars
        pno next;

        pno (*AddClient)(client_t *);    
};

pno client_t_AddClient(client_t *self) { /* code */ }

int main()
{

    client_t client;
    client.AddClient = client_t_AddClient; // probably really done in some init fn

    //code ..

    client.AddClient(&client);

}

最佳答案

pno 是一个指向 struct client_t 的类型定义。

typedef struct client_t client_t, *pno;

含义相同:

typedef struct client_t client_t;
typedef struct client_t *pno;

因此,client_tstruct client_t 含义相同,pnostruct client_t * 含义相同。让我们在您的代码中替换它们。

struct client_t 
{
        pid_t pid;
        char password[TAM_MAX]; // -> 50 chars
        struct client_t *next;
        struct client_t *(*AddClient)(struct client_t *);    
};

struct client_t *client_t_AddClient(client_t *self) { /* code */ }

int main()
{

    struct client_t client;
    client.AddClient = client_t_AddClient; // probably really done in some init fn

    //code ..

    client.AddClient(&client);

}

因此,struct client_t 有一个名为 next 的成员,它是指向 struct client_t 的指针 - 经典链表。 struct client_t *(*AddClient)(struct client_t *); 是一个函数指针声明,它接受一个指向 struct client_t 的指针并返回一个指向 struct 的指针client_t - 从名称来看,它将下一个客户端添加到当前项目,但我不知道它返回什么,因为它还没有被解释。

我不鼓励使用 typedef 来隐藏指针 - 它会降低代码的可读性。

But how does the additional *pno work, what is it doing?

附加*pno将附加标识符pno定义为struct client_t *类型的typedef。

Why is next never used?

因为你没有显示它的使用地点。 (?) 如果不了解上下文,就不可能回答这个问题。

Where does *self come from?

它是函数 client_t_AddClient 定义中给定参数的标识符。我相信它“来自”这段代码的作者 - 他决定将此函数的参数命名为“self”。我猜这意味着它引用当前对象,例如模仿 python 中的 self 关键字。

关于c - 理解代码: function in struct时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60048244/

相关文章:

c - 如何使c程序在Windows 7中可执行

c - mmap 加载共享对象并获取函数指针

ruby - 使用关键字参数初始化 Ruby 结构

c - 如何返回带数组的 C 结构体?

go - 如何使用反射来设置嵌套的结构域值

c - 声明数组时出现段错误

c - C中的 float 转换为两个16位整数

c - C如何返回一个结构?

c++ - 使用 Gmail 帐户通过 C++ 发送电子邮件

json - 在 Golang 中打印解码后的 JSON