我知道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:這是因爲他稍後更新了問題,沒有人回答這個問題......更新後的問題不是重複的,它不應該被關閉。並且因爲沒有答案,所以這個答案也不應該作爲重複來封閉。哦,這很複雜。 –