结构标记和名称,为什么声明为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
,即MYSTRUCT
是MYSTRUCT
的别名。 这解释了它是如何正确的c ++。
要创建变量,请删除typedef:
struct tagMyStruct { int numberOne; int numberTwo; } MYSTRUCT;