2013-07-07 67 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