C++中'结构'和'类型化结构'之间的区别?

在C++中,是否有任何区别。

struct Foo { ... };

typedef struct { ... } Foo;
解决办法

在C++中,只有一个细微的差别。 这是从C语言中保留下来的,在C语言中,它是有区别的。

C语言标准(C89 §3.1.2.3, C99 §6.2.3, 和C11 §6.2.3)规定了不同类别标识符的独立命名空间,包括标签标识符(用于结构/联合/enum)和普通标识符(用于typedef和其他标识符)。

如果你刚才说

struct Foo { ... };
Foo x;

你会得到一个编译器错误,因为Foo只在标签命名空间中定义。

你必须将其声明为。

struct Foo x;

任何时候你想引用一个 "Foo",你都必须把它称为 "结构Foo"。 这很快就会令人厌烦,所以你可以添加一个 "typedef"。

struct Foo { ... };
typedef struct Foo Foo;

现在struct Foo(在标签命名空间)和普通的Foo(在普通标识符命名空间)都是指同一事物,你可以自由地声明Foo类型的对象,而不用struct关键字。


构造。

typedef struct Foo { ... } Foo;

只是声明和 "typedef "的缩写。


最后。

typedef struct { ... } Foo;

声明了一个匿名结构,并为其创建了一个 "typedef"。 因此,通过这个结构,它在标签命名空间中没有名字,只有在typedef命名空间中的名字。 这意味着它也不能被向前声明。 如果你想进行正向声明,你必须在标签命名空间中给它一个名字


在C++中,所有的结构'/联盟'/枚举'/类'声明都像隐式`typedef''ed一样,只要该名称不被另一个同名的声明所隐藏。 详细内容请参见Michael Burr'的回答

评论(16)

有***的区别,但很微妙。这样看:struct Foo引入了一个新的类型。第二种是为一个未命名的struct类型创建一个叫做Foo的别名(而不是一个新类型)。

7.1.3 typedef指定器

1 [...]

一个用typedef指定符声明的名字成为一个typedef-name。在其声明的范围内,一个 在其声明的范围内,typedef-name在语法上等同于一个关键字,并且以条款8中描述的方式命名与标识符相关的类型。 第8条中描述的方式命名与标识符相关的类型。因此,一个类型定义名是另一个类型的同义词。一个类型定义名并不像类声明(9.1)或枚举声明那样引入一个新的类型

8 如果typedef声明定义了一个未命名的类(或枚举),那么该声明所声明的第一个tyedef-name 的第一个类型定义名被用来表示类的类型(或枚举的类型),只用于链接的目的(3.5)。 仅用于链接目的(3.5)。[ 例子。

typedef struct { } *ps, S; // S is the class name for linkage purposes

所以,一个类型化的定义**总是被用作另一个类型的占位符/同义词。

评论(0)

在C++中没有区别,但我相信在C中,它将允许你声明Foo结构的实例,而不用明确地做。

struct Foo bar;
评论(1)