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

时间:2010-12-02 11:36:07

标签: c++ c struct language-features

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

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

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

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

MYSTRUCT *pStruct = new MYSTRUCT;

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

3 个答案:

答案 0 :(得分:9)

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

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

为避免一直编写结构,struct tagMyStructtypedef'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,即MYSTRUCTtagMyStruct的别名。这解释了它是如何正确的c ++。

要创建变量,请删除typedef:

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