在C,有沒有聲明一個結構作爲的typedef與在C中的結構和枚舉沒有的typedef
typedef struct {...} Foo;
和
struct Foo {...};
我知道之間的任何實際的區別的第二個要求您前綴與struct
一起使用,但是在編寫或執行程序時我會注意到這兩個定義之間有什麼區別?怎麼樣與enum
?
在C,有沒有聲明一個結構作爲的typedef與在C中的結構和枚舉沒有的typedef
typedef struct {...} Foo;
和
struct Foo {...};
我知道之間的任何實際的區別的第二個要求您前綴與struct
一起使用,但是在編寫或執行程序時我會注意到這兩個定義之間有什麼區別?怎麼樣與enum
?
更新:請參閱附加評論以回答澄清。
原創帖子。
此外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;
最後一個是使用'typedef'作爲* pointer *類型的好處,不適用於結構類型。指針類型的Typedef通常被認爲是不好的風格,理由是指針與C非常不可分,隱藏某些「指針」會導致混淆。通過每行聲明一個對象(或者非常小心),可以避免多重聲明問題。第一次嘗試使用'errptr'時可能會檢測到錯誤。 –
同意。只有在類型是真正不透明的情況下才應該使用'typedef'指針。 –
這是一個好點。我錯過了這個區別。 – dtmland
我想看看這個SO question,然後總結,有struct { ... }
和typedef struct { ... }
之間沒有明顯的功能差異雖然後者可能使你的代碼,那麼麻煩,更容易理解,如果正確使用。
使用'typedef'只是爲特定類型定義一個別名。如果這種類型是一個結構,枚舉或其他東西並不重要。 –
@interjayl;但是這個q被標記爲c,所以有點奇怪地指向C++標題。 – Bathsheba
糟糕,我打算標記爲C:[爲什麼我們應該在C中經常鍵入一個結構?](http:// stackoverflow。com/questions/252780/why-should-we-typedef-a-struct-so-often-in-c) – interjay