2017-09-05 124 views
0

如果有,這兩個typedef實現與結構之間的區別是什麼?這兩個typedef的實現具有相同的結構嗎?

typedef struct Data{ 
    int x; 
    int y; 
} Data; 

struct Data{ 
    int x; 
    int y; 
}; 
typedef struct Data Data; 
+3

您不需要在C++中使用它們中的任何一個,因此我將刪除C++標記。 –

+2

C!= C++。一旦你知道你想問什麼語言,請只提問。 – tambre

+0

c或C++?我確實有所作爲,因爲在C++中你不會寫'typedef struct Data {...',除非你儘量讓你的代碼看起來像c – user463035818

回答

0

是的,他們倆的typedef Datastruct Data,allthough通常人們會用不同的名稱,以避免混淆。

請注意,在C++中,使用該類型時根本不需要struct部分,所以它通常根本沒有typedef。這同樣適用於enum等。

struct Data 
{ 
    int x; 
    int y; 
}; 
void foo1(Data data); // OK in C++ 
void foo2(struct Data data); // OK in C or C++, but almost never seen in C++ 


typedef struct Data2_ 
{ 
    int x; 
    int y; 
}Data2; 
void foo3(Data2 data); // OK in C or C++, but C++ code tends to skip the typedef as well 
+0

請注意,如果沒有'typedef',C++代碼將使用'Data2_t',而C將使用'struct Data2_t'(而不是'Data2' - 我會讓它成爲'struct Data2 {...}')。另請注意,POSIX搶奪了'_t'後綴 - 當您使用它時,您有可能與POSIX頭文件發生衝突。 (是的,我已經看到它發生了,是的,它會導致頭痛。) –

+0

它仍然適用於C++使用typedefed的一個,另一個在大多數C庫中通常甚至不是一個真正的「已發佈」名稱。是的,關於'_t'。在Win32和POSIX之間,一切都很痛苦...... –

+0

許多C庫 - 例如,看看POSIX,還有Linux內核(它不是一個庫,但是......) - 只使用'struct DoHickey'而不是' typedef struct DoHickey DoHickey;'就在眼前。至少當這種類型不是不透明的時候。 (所以'DIR'是一個不透明的類型,但'struct dirent'就是你在裏面搜索的地方。) –

相關問題