我知道typedef'ing允许你在不使用struct关键字的情况下引用结构。但是,有了这个:
typedef struct SYSTEM SYSTEM;
我在C
API中看到过此typedef,但struct SYSTEM
先前未定义 。
实际上,只包含该行的.c
文件将自行编译。
编译器认为SYSTEM (or struct SYSTEM)
实际上是什么?
非常感谢!
答案 0 :(得分:5)
不需要定义结构。它只需要声明。您提供的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.
答案 1 :(得分:0)
这是一个典型的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
答案 2 :(得分:-1)
我认为这通常是不明智的行为,但要点是:
typedef
type name
..此处类型为struct SYSTEM
,分配的名称为SYSTEM
。
通常会给typedef指定一个与typedef派生类型不同的名称。因此,很多代码维护者可能会对这种行为抱有低估。