在最近看到的一些代码中,有一个像这样定义的结构:
typedef struct tagMyStruct {
int numberOne;
int numberTwo;
} MYSTRUCT;
我理解这一点的方式,tagMyStruct
是新的数据类型,MYSTRUCT
是在那里创建的变量。
在另一个地方,这是这样使用的:
MYSTRUCT *pStruct = new MYSTRUCT;
并且它在Visual Studio 2010中编译得很好。那个有效的C ++怎么样?我以为MYSTRUCT
是变量而不是类型?
答案 0 :(得分:9)
没有。 tagMyStruct
是结构的名称。在C中,与C ++不同,每次使用struct类型时都必须显式使用struct关键字。例如
tagMyStruct x; //error
struct tagMyStruct x; //OK
为避免一直编写结构,struct tagMyStruct
为typedef
'd为MYSTRUCT
。现在你可以写
MYSTRUCT x; //ok, same as struct tagMyStruct x;
你认为这是(一个变量定义)没有typedef关键字,就像这个
struct tagMyStruct {
int numberOne;
int numberTwo;
} MYSTRUCT;
顺便说一句
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)
HTH
答案 1 :(得分:5)
struct tagMyStruct { ... };
定义了一个名为tagMyStruct
的新C ++类型(类)。
struct { ... } MYSTRUCT;
使用给定的结构定义一个名为MYSTRUCT
的变量。
typedef struct { ... } MYSTRUCT;
定义了一个名为MYSTRUCT
的typedef,它等同于给定的匿名结构。
typedef tagMyStruct struct { ... } MYSTRUCT;
定义了一个名为MYSTRUCT
的typedef和一个名为tagMyStruct
的类型。所以MYSTRUCT只是tagMyStruct的typedef。因此,MYSTRUCT pStruct
定义了名为tagMyStruct
的{{1}}。
您提供的分配无效,因为pStruct
会将指针返回给new MYSTRUCT
。
答案 2 :(得分:3)
您错了,您使用的是typedef
,即MYSTRUCT
是tagMyStruct
的别名。这解释了它是如何正确的c ++。
要创建变量,请删除typedef:
struct tagMyStruct {
int numberOne;
int numberTwo;
} MYSTRUCT;