请问typedef struct sd_journal sd_journal; 这种自反typedef的含义是什么?
解析
typedef struct sd_journal sd_journal; 的含义 你看到的这行代码并不是什么“自反/递归typedef”,而是C语言里**不透明类型(Opaque Type)**的典型声明方式,主要用于库的封装设计,具体作用如下:
简化类型书写
原本声明该结构体指针需要写struct sd_journal *journal_ptr;,有了这个typedef后,直接写sd_journal *journal_ptr;即可,让代码更简洁。隐藏内部实现细节
systemd这类库用这种方式,只对外暴露类型的存在,不公开结构体的具体成员。用户无法直接访问sd_journal内部的变量,只能通过库提供的API(比如sd_journal_open()、sd_journal_next()等)来操作这个类型的对象。这样做的好处是:库的内部实现可以随时修改,而不会影响调用方的代码,保证了API的稳定性和兼容性。注意:这不是递归定义
这里只是给未定义的结构体struct sd_journal起了别名sd_journal,并没有在结构体内部包含自身类型的成员,完全不存在递归问题。真正的递归结构体定义是类似struct node { struct node *next; };这种,但和你看到的这行代码本质不同。
举个实际使用的例子,你之后在systemd的API里会看到类似这样的函数声明:
int sd_journal_open(sd_journal **ret, int flags);
你只需要知道ret是一个指向sd_journal指针的指针,调用这个函数就能获取到可用的sd_journal对象,无需关心它内部到底存了什么数据。
内容的提问来源于stack exchange,提问作者Jonathan Wilbur
相关产品推荐
相关产品推荐

