我知道 typedef'ing 允许您在不使用 struct 关键字的情况下引用结构。但是,有了这个:
typedef struct SYSTEM SYSTEM;
我在C
API 中看到过这个 typedef,但之前没有struct SYSTEM
定义过。
事实上,.c
仅包含该行的文件将自行编译。
编译器认为SYSTEM (or struct SYSTEM)
实际上是什么?
非常感谢!
该结构不需要定义。它只需要声明。您提供的 typedef 声明包含struct SYSTEM
.
所以它相当于:
struct SYSTEM;
typedef struct SYSTEM SYSTEM;
多亏了这个 typedef,SYSTEM
现在命名了一个不完整的类型,所以你可以像SYSTEM *
在接口定义中一样使用它,而不需要暴露结构的实际定义,它可以保持私有:
public_header.h:
typedef struct SYSTEM SYSTEM;
SYSTEM * create_system();
int do_useful_thing_with(SYSTEM * system, int count, void * addr);
void destroy_system(SYSTEM * system);
private_impl.c:
#include <public_header.h>
struct SYSTEM { int a; char b[12]; float q; void * next; };
SYSTEM * create_system()
{
SYSTEM * p = malloc(sizeof *p);
if (p) { p->a = 2; p->q = 1.5; }
return p;
}
void destroy_system(SYSTEM * system)
{
free(system);
}
// etc.
这是一个典型的 C 构造,与直接在全局命名空间中定义类型的 C++ 和 Java 等不同。C 结构不能仅通过其名称访问,因此typedef
需要能够仅调用 SYSTEM SYSTEM
。
struct SYSTEM {
...
};
struct SYSTEM foo; //legal
SYSTEM bar; //illegal
typedef struct SYSTEM SYSTEM; //give it a global name
SYSTEM baz; //now it's legal
我想说这通常是不明智的行为,但要点是:
typedef
类型 名称
..这里的类型struct SYSTEM
和分配的名称是SYSTEM
.
通常会给 typedef 一个不同于派生 typedef 的类型的名称。因此,许多代码维护者可能对这种行为持低意见。