2013-06-25 101 views
3

在C,有沒有聲明一個結構作爲的typedef與在C中的結構和枚舉沒有的typedef

typedef struct {...} Foo; 

struct Foo {...}; 

我知道之間的任何實際的區別的第二個要求您前綴與struct一起使用,但是在編寫或執行程序時我會注意到這兩個定義之間有什麼區別?怎麼樣與enum

+0

使用'typedef'只是爲特定類型定義一個別名。如果這種類型是一個結構,枚舉或其他東西並不重要。 –

+3

@interjayl;但是這個q被標記爲c,所以有點奇怪地指向C++標題。 – Bathsheba

+1

糟糕,我打算標記爲C:[爲什麼我們應該在C中經常鍵入一個結構?](http:// stackoverflow。com/questions/252780/why-should-we-typedef-a-struct-so-often-in-c) – interjay

回答

5

更新:請參閱附加評論以回答澄清。

原創帖子。

此外having to write "struct" everywhere,其他值得注意的事情是,使用一個typedef將允許您avoid subtle syntax errors when working with pointers

報價:

的typedef還可以簡化的聲明指針類型。考慮 此:

struct Node { 
    int data; 
    struct Node *nextptr; 
}; 

使用的typedef,上述代碼可以改寫如下:

typedef struct Node Node; 
struct Node { 
    int data; 
    Node *nextptr; 
}; 

在C中,一個可以在單個 聲明聲明相同類型的多個變量,甚至混合指針和非指針。但是,有一個 需要在每個變量前加一個星號來指定它爲 指針。在下面,程序員可能會認爲errptr實際上是一個Node *,但是印刷錯誤意味着errptr是一個 節點。這可能導致細微的語法錯誤。

struct Node *startptr, *endptr, *curptr, *prevptr, errptr, *refptr; 

通過定義一個節點*的typedef,這就保證了所有的變量 將指針類型。

typedef struct Node *NodePtr; 
... 
NodePtr startptr, endptr, curptr, prevptr, errptr, refptr; 
+4

最後一個是使用'typedef'作爲* pointer *類型的好處,不適用於結構類型。指針類型的Typedef通常被認爲是不好的風格,理由是指針與C非常不可分,隱藏某些「指針」會導致混淆。通過每行聲明一個對象(或者非常小心),可以避免多重聲明問題。第一次嘗試使用'errptr'時可能會檢測到錯誤。 –

+1

同意。只有在類型是真正不透明的情況下才應該使用'typedef'指針。 –

+0

這是一個好點。我錯過了這個區別。 – dtmland

0

如果你寫

typedef struct {...} foo;

這樣可以節省你不必編寫struct foo無處不在:你可以只寫foo

(順便說一下,您可以在C++中免費獲得此符號便利)。

+2

也許我不清楚,但我問是否還有其他區別。 – cjubb39

+0

@ interjay的參考資料足夠全面瞭解這一點;但總的來說,除非你利用typedef來創建一個不透明的類型,否則沒有什麼區別 - 你不是因爲你有{...} – Bathsheba

0

我想看看這個SO question,然後總結,有struct { ... }typedef struct { ... }之間沒有明顯的功能差異雖然後者可能使你的代碼,那麼麻煩,更容易理解,如果正確使用。