这个C代码是什么意思?

时间:2013-07-07 20:11:54

标签: c struct typedef

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

typedef struct SYSTEM SYSTEM;

我在C API中看到过此typedef,但struct SYSTEM先前未定义

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

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

非常感谢!

3 个答案:

答案 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派生类型不同的名称。因此,很多代码维护者可能会对这种行为抱有低估。