在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'的回答。
有***的区别,但很微妙。这样看: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
所以,一个类型化的定义**总是被用作另一个类型的占位符/同义词。