2010-12-02 52 views
7

在一些代碼,我最近看到有這樣定義的結構:結構標記和名稱,爲什麼聲明爲名稱的局部變量編譯?

typedef struct tagMyStruct { 
    int numberOne; 
    int numberTwo; 
} MYSTRUCT; 

我明白這一點的方式,tagMyStruct是新的數據類型和MYSTRUCT是建立在那裏的變量。

在另外一個地方,這是像這樣使用:

MYSTRUCT *pStruct = new MYSTRUCT; 

,並編譯Visual Studio 2010中精細如何是有效的C++?我以爲MYSTRUCT是一個變量,而不是一個類型?

回答

9

tagMyStruct號是該結構的名稱。在C中,與C++不同,每次使用struct類型時都必須顯式使用struct關鍵字。例如

tagMyStruct x; //error 
struct tagMyStruct x; //OK 

爲了避免寫作結構的時候,struct tagMyStructtypedef倒是給MYSTRUCT。現在,你可以寫

MYSTRUCT x; //ok, same as struct tagMyStruct x; 

你認爲這是什麼(變量定義)將沒有typedef關鍵字,這樣

struct tagMyStruct { 
    int numberOne; 
    int numberTwo; 
} MYSTRUCT; 

BTW

MYSTRUCT pStruct = new MYSTRUCT; //error cannot convert MYSTRUCT* to MYSTRUCT 

無效C或無論如何C++。也許你的意思是

MYSTRUCT* pStruct = new MYSTRUCT; //valid C++ (invalid C - use malloc instead of new in C) 

心連心

+0

糟糕,你是對的。我錯過了那裏的那個。 – bastibe 2010-12-02 11:55:22

3

您錯了,您正在使用typedef,即MYSTRUCTtagMyStruct的別名。這解釋了它是如何正確的C++。

爲了創建一個變量,丟棄的typedef:

struct tagMyStruct { 
    int numberOne; 
    int numberTwo; 
} MYSTRUCT; 
+0

這些是別名`MYSTRUCT`和`tagMystruct`只在C++中不在C – 2016-02-01 18:04:29

5
struct tagMyStruct { ... }; 

定義了一個新的C++類型(類)稱爲tagMyStruct

struct { ... } MYSTRUCT; 

定義了一個名爲MYSTRUCT的變量,它具有給定的結構。

typedef struct { ... } MYSTRUCT; 

定義了一個名爲MYSTRUCT的typedef,它與給定的匿名結構等效。

typedef tagMyStruct struct { ... } MYSTRUCT; 

定義了一個名爲MYSTRUCT的typedef和被叫tagMyStruct類型。所以MYSTRUCT只是tagMyStruct的一個typedef。因此,MYSTRUCT pStruct定義爲tagMyStruct,稱爲pStruct

您給出的作業無效,因爲new MYSTRUCT返回指針MYSTRUCT

相關問題