2013-07-07 173 views
2

我知道typedef'ing允许你在不使用struct关键字的情况下引用一个结构。然而,与此:这个C代码是什么意思?

typedef struct SYSTEM SYSTEM; 

我已经看到了这个的typedef在C API,但struct SYSTEM具有如先前所定义。

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

编译器认为SYSTEM (or struct SYSTEM)究竟是什么?

非常感谢!

+1

的可能重复[什么是typedef'ing一个结构本身的影响?](http://stackoverflow.com/questions/17515787/what-is-the-effect-of-typedefing-a -struct-to-itself) – 2013-07-07 20:17:31

+0

***您在18分钟前提问过这个问题***已关闭。为什么你重新发布它,认真? – 2013-07-07 20:18:17

+3

@ H2CO3:这是因为他稍后更新了问题,没有人回答这个问题......更新后的问题不是重复的,它不应该被关闭。并且因为没有答案,所以这个答案也不应该作为重复来封闭。哦,这很复杂。 –

回答

5

该结构不需要定义。它只需要宣告。您提供的typedef声明包含struct SYSTEM的声明。

所以它等同于:

struct SYSTEM; 

typedef struct SYSTEM SYSTEM; 

由于这种类型定义,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. 
+0

谢谢!所以大概API程序员已经在接口的API端定义了这个地方? – James

+0

@詹姆斯:这不是空的。它没有定义。一个空的结构体是一个定义的结构体,如'struct Foo {};'。我添加了一个解释;你可以使用它作为一个不完整的类型。 –

+0

当我可以的时候会接受这个:) – James

-1

我会说这是一般不明智的行为,但要点是:

typedeftypename

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

通常人们会给出typedef的名称,而不是typedef的派生类型。因此许多代码维护者可能会对这种行为产生低估。

+0

如果你正确使用它,这是很好的,如果你滥用它是不好的。良好的用法通常正是OP询问的内容(摆脱了不必要的'struct'混乱),糟糕的用法恰恰就是你所说的(给任意名称的东西命名)。 – cmaster

+1

调用'struct'“混乱”是对C和/或纯懒惰类型系统的严重误解。 –

+0

*通常,人们会给出typedef的名称,而不是typedef的派生类型。* Um,no。 'typedef struct NAME NAME'是旧C代码中非常常见的用法。这是DIY的语法糖,以避免不得不一遍又一遍地输入“结构”。它没有错。 – dodgethesteamroller

0

这是一个典型的C结构,与C++和Java等不同,它直接定义全局名称空间中的类型。 C结构不能仅以其名称访问,因此需要typedef才能调用系统,只需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