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

bas*_*ibe 7 c c++ language-features struct

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

typedef struct tagMyStruct {
    int numberOne;
    int numberTwo;
} MYSTRUCT;
Run Code Online (Sandbox Code Playgroud)

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

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

MYSTRUCT *pStruct = new MYSTRUCT;
Run Code Online (Sandbox Code Playgroud)

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

Arm*_*yan 9

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

tagMyStruct x; //error
struct tagMyStruct x; //OK
Run Code Online (Sandbox Code Playgroud)

为了避免一直写结构,struct tagMyStructtypedefMYSTRUCT.现在你可以写了

MYSTRUCT x; //ok, same as struct tagMyStruct x;
Run Code Online (Sandbox Code Playgroud)

您认为这是(变量定义)将没有typedef关键字,就像这样

struct tagMyStruct {
    int numberOne;
    int numberTwo;
} MYSTRUCT;
Run Code Online (Sandbox Code Playgroud)

BTW

MYSTRUCT pStruct = new MYSTRUCT; //error cannot convert MYSTRUCT* to MYSTRUCT
Run Code Online (Sandbox Code Playgroud)

无论如何都不是有效的C或C++.也许你的意思是

MYSTRUCT* pStruct = new MYSTRUCT; //valid C++ (invalid C - use malloc instead of new in C)
Run Code Online (Sandbox Code Playgroud)

心连心


Amn*_*non 5

struct tagMyStruct { ... };
Run Code Online (Sandbox Code Playgroud)

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

struct { ... } MYSTRUCT;
Run Code Online (Sandbox Code Playgroud)

定义MYSTRUCT使用给定结构调用的变量.

typedef struct { ... } MYSTRUCT;
Run Code Online (Sandbox Code Playgroud)

定义一个被调用的typedef MYSTRUCT,它等同于给定的匿名结构.

typedef tagMyStruct struct { ... } MYSTRUCT;
Run Code Online (Sandbox Code Playgroud)

定义一个被调用的typedef MYSTRUCT和一个名为的类型tagMyStruct.所以MYSTRUCT只是tagMyStruct的typedef.因此,MYSTRUCT pStruct定义一个tagMyStruct被调用的pStruct.

你给我的任务是无效的,因为new MYSTRUCT回报指针MYSTRUCT.