结构标记和名称,为什么声明为name的局部变量编译?

在最近看到的一些代码中,有一个像这样定义的结构:

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

我理解这一点的方式, tagMyStruct是新的数据类型, MYSTRUCT是一个在那里创建的变量。

在另一个地方,这是这样使用的:

 MYSTRUCT *pStruct = new MYSTRUCT; 

它使用Visual Studio 2010编译得很好。那个有效的C ++怎么样? 我以为MYSTRUCT是一个变量而不是一个类型?

编号tagMyStruct是结构的名称。 在C中,与C ++不同,每次使用struct类型时都必须显式使用struct关键字。 例如

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

为了避免一直写struct, struct tagMyStruct是对MYSTRUCT typedef 。 现在你可以写了

 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) 

心连心

 struct tagMyStruct { ... }; 

定义了一个名为tagMyStruct的新C ++类型(类)。

 struct { ... } MYSTRUCT; 

使用给定的结构定义一个名为MYSTRUCT的变量。

 typedef struct { ... } MYSTRUCT; 

定义一个名为MYSTRUCT的typedef,它等同于给定的匿名结构。

 typedef tagMyStruct struct { ... } MYSTRUCT; 

定义了一个名为MYSTRUCT的typedef和一个名为tagMyStruct的类型。 所以MYSTRUCT只是tagMyStruct的typedef。 因此, MYSTRUCT pStruct定义了一个名为pStruct

您给出的赋值无效,因为new MYSTRUCT返回指向 MYSTRUCT指针

你错了,你使用的是typedef ,即MYSTRUCTMYSTRUCT的别名。 这解释了它是如何正确的c ++。

要创建变量,请删除typedef:

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