我知道typedef'ing允许你在不使用struct关键字的情况下引用一个结构。然而,与此:这个C代码是什么意思?
typedef struct SYSTEM SYSTEM;
我已经看到了这个的typedef在C
API,但struct SYSTEM
具有不如先前所定义。
实际上,只包含该行的.c
文件将自行编译。
编译器认为SYSTEM (or struct SYSTEM)
究竟是什么?
非常感谢!
我知道typedef'ing允许你在不使用struct关键字的情况下引用一个结构。然而,与此:这个C代码是什么意思?
typedef struct SYSTEM SYSTEM;
我已经看到了这个的typedef在C
API,但struct SYSTEM
具有不如先前所定义。
实际上,只包含该行的.c
文件将自行编译。
编译器认为SYSTEM (or struct SYSTEM)
究竟是什么?
非常感谢!
该结构不需要定义。它只需要宣告。您提供的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.
我会说这是一般不明智的行为,但要点是:
typedef
typename
..where这里型是struct SYSTEM
和分配的名称是SYSTEM
。
通常人们会给出typedef的名称,而不是typedef的派生类型。因此许多代码维护者可能会对这种行为产生低估。
如果你正确使用它,这是很好的,如果你滥用它是不好的。良好的用法通常正是OP询问的内容(摆脱了不必要的'struct'混乱),糟糕的用法恰恰就是你所说的(给任意名称的东西命名)。 – cmaster
调用'struct'“混乱”是对C和/或纯懒惰类型系统的严重误解。 –
*通常,人们会给出typedef的名称,而不是typedef的派生类型。* Um,no。 'typedef struct NAME NAME'是旧C代码中非常常见的用法。这是DIY的语法糖,以避免不得不一遍又一遍地输入“结构”。它没有错。 – dodgethesteamroller
这是一个典型的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
的可能重复[什么是typedef'ing一个结构本身的影响?](http://stackoverflow.com/questions/17515787/what-is-the-effect-of-typedefing-a -struct-to-itself) – 2013-07-07 20:17:31
***您在18分钟前提问过这个问题***已关闭。为什么你重新发布它,认真? – 2013-07-07 20:18:17
@ H2CO3:这是因为他稍后更新了问题,没有人回答这个问题......更新后的问题不是重复的,它不应该被关闭。并且因为没有答案,所以这个答案也不应该作为重复来封闭。哦,这很复杂。 –