2010-11-02 126 views
8

我目前正在使用C++ IDE來處理需要在C上工作的東西,並且希望確保我以後不會遇到問題。使得下面的結構後:C和C++中的struct和typedef

typedef struct test { 
    int a; 
    int b; 
}; 

我然後使用 test my_test;然後像my_test.a = 5,等等...這東西的作品在我的VStudio C++細創建它的一個實例。 稍後會在gcc上工作嗎?

我讀到了彈出的相關問題(我看到我不是第一個有這類問題的人)但似乎沒有人使用我的方式。

實際上,typedef struct {//stuff} test;和我的版本有什麼區別?

+0

您可以通過打開命令提示符並輸入:'gcc FilePath/foo.c'來編譯程序。 – 2010-11-02 23:29:02

+2

[typedef struct vs struct definitions]可能的重複(http://stackoverflow.com/questions/1675351/typedef-struct-vs-struct-definitions)我寫了一個廣泛的答案,不同之處以及每個的具體和實際含義C和C++中的這兩個構造作爲鏈接問題的答案。請閱讀它以瞭解接受的答案中未提供的詳細信息。 – 2010-11-02 23:57:30

回答

18

之間的區別:

struct Name {}; 

而且

typedef struct Name {} Name; 

的是,在C,你需要使用:

struct Name instance_name; 

對於前者,而後者你可以這樣做:

Name instance_name; 

在C++中,無論在哪種情況下都不需要重複struct關鍵字。請注意,您在其中創建無名稱的typedef(即typedef struct Name{};)的示例是非標準AFAIK(如果使用關鍵字typedef,則需要提供一個用於鍵入該名稱的別名)。

至於最後變化:

typedef struct { /* ... */ } Name; 

上面的代碼創建一個別名爲名稱的無名結構。您可以像使用typedef struct Name { /* ... */ } Name;一樣使用這樣的結構,但是編譯器通常會發出struct(不是別名)的名稱,所以如果您給它一個名稱和typedef,那麼您可能會得到更好的涉及該結構的錯誤消息而不是typedef一個匿名結構。

+0

我剛剛注意到,'Warning'typedef':當'test'沒有聲明變量時忽略''是我按照我在原始代碼片段中寫入的方式執行操作時得到的結果。哪些問題引發了我寫的東西甚至做了什麼? – user472875 2010-11-02 23:35:34

+0

@ user472875:沒有。這就像寫作「typedef int;」。或者就像在字典中寫一個定義而不給出那個意思那個詞。 – 2010-11-02 23:55:23

18
typedef struct THIS_IS_A_TAG 
{ 
    int a; 
    int b; 
} THIS_IS_A_TYPEDEF; 

THIS_IS_A_TYPEDEF object1;  // declare an object.  C:Ok,  C++:Ok 
struct THIS_IS_A_TAG object2; // declare another object. C:Ok,  C++:Ok 
THIS_IS_A_TAG object3;   // declare another object. C:Not Ok, C++:Ok 

typedef的原因是因爲C程序員希望能夠做第三件事,但他們不能。

7

在C和C++,示例性構建體是溫和無意義:

typedef struct test { 
    int a; 
    int b; 
}; 

在C中,這說,有一個類型struct test與兩個整數作爲內容。如果在大括號'}'和分號';'之間有一個名稱,那麼您將從關鍵字typedef獲得一些好處;按照現狀,關鍵字typedef是多餘的,並且(如果設置得很模糊),GCC會提醒你。

在C++中,這說有一個類型struct test;此外,在C++中,它也創建了一個類型test(這在C中不會發生)。關鍵字typedef仍然可以省略,並且可以實現相同的結果。

該語法是合法的;這是沒有用的,就是這樣。關鍵字typedef可以省略而不用稍微改變程序的含義。

你可以這樣做:

typedef struct test { 
    int a; 
    int b; 
} test; 

現在,在C和C++,你有一個類型struct test併爲它test的別名。