2

我知道 typedef'ing 允许您在不使用 struct 关键字的情况下引用结构。但是,有了这个:

typedef struct SYSTEM SYSTEM;

我在CAPI 中看到过这个 typedef,但之前没有struct SYSTEM定义过。

事实上,.c仅包含该行的文件将自行编译。

编译器认为SYSTEM (or struct SYSTEM)实际上是什么?

非常感谢!

4

3 回答 3

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.
于 2013-07-07T20:13:55.203 回答
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
于 2013-07-07T20:19:00.293 回答
-1

我想说这通常是不明智的行为,但要点是:

typedef 类型 名称

..这里的类型struct SYSTEM和分配的名称是SYSTEM.

通常会给 typedef 一个不同于派生 typedef 的类型的名称。因此,许多代码维护者可能对这种行为持低意见。

于 2013-07-07T20:14:26.893 回答