在c++中,有什么区别:
struct Foo { ... };
and:
typedef struct { ... } Foo;
在c++中,有什么区别:
struct Foo { ... };
and:
typedef struct { ... } Foo;
当前回答
不能对typedef结构使用前向声明。
该结构本身是匿名类型,因此没有实际的名称来转发声明。
typedef struct{
int one;
int two;
}myStruct;
像这样的前向声明是行不通的:
struct myStruct; //forward declaration fails
void blah(myStruct* pStruct);
//error C2371: 'myStruct' : redefinition; different basic types
其他回答
在c++中没有区别,但我相信在C中,它会允许你声明结构Foo的实例,而无需显式地执行:
struct Foo bar;
在c++中,只有细微的区别。它是C语言的延续,在C语言中是有区别的。
C语言标准(C89§3.1.2.3,C99§6.2.3和C11§6.2.3)要求对不同类别的标识符使用单独的名称空间,包括标签标识符(用于struct/union/enum)和普通标识符(用于类型定义和其他标识符)。
如果你说:
struct Foo { ... };
Foo x;
你会得到一个编译器错误,因为Foo只定义在标记命名空间中。
你必须声明它为:
struct Foo x;
任何时候你想引用一个Foo,你总是必须称它为结构体Foo。这很快就会让人讨厌,所以你可以添加一个类型定义:
struct Foo { ... };
typedef struct Foo Foo;
现在,struct Foo(在标记名称空间中)和普通Foo(在普通标识名称空间中)都引用相同的东西,您可以自由地声明类型为Foo的对象,而不需要struct关键字。
构造:
typedef struct Foo { ... } Foo;
只是声明和类型定义的缩写。
最后,
typedef struct { ... } Foo;
声明一个匿名结构并为其创建一个类型定义。因此,使用这个构造,它在标记名称空间中没有名称,而在typedef名称空间中只有名称。这意味着它也不能前向声明。如果希望进行前向声明,则必须在标记名称空间中为其指定一个名称。
在c++中,所有struct/union/enum/class声明都是隐式类型定义的,只要该名称没有被另一个同名声明所隐藏。详见Michael Burr的回答。
c++中'typedef struct'和'struct'的一个重要区别是'typedef struct'中的内联成员初始化将不起作用。
// the 'x' in this struct will NOT be initialised to zero
typedef struct { int x = 0; } Foo;
// the 'x' in this struct WILL be initialised to zero
struct Foo { int x = 0; };
不能对typedef结构使用前向声明。
该结构本身是匿名类型,因此没有实际的名称来转发声明。
typedef struct{
int one;
int two;
}myStruct;
像这样的前向声明是行不通的:
struct myStruct; //forward declaration fails
void blah(myStruct* pStruct);
//error C2371: 'myStruct' : redefinition; different basic types
有区别,但很微妙。可以这样看:struct Foo引入了一个新的类型。第二个是为一个未命名的结构类型创建一个名为Foo的别名(不是一个新类型)。
7.1.3 The typedef specifier 1 [...] A name declared with the typedef specifier becomes a typedef-name. Within the scope of its declaration, a typedef-name is syntactically equivalent to a keyword and names the type associated with the identifier in the way described in Clause 8. A typedef-name is thus a synonym for another type. A typedef-name does not introduce a new type the way a class declaration (9.1) or enum declaration does. 8 If the typedef declaration defines an unnamed class (or enum), the first typedef-name declared by the declaration to be that class type (or enum type) is used to denote the class type (or enum type) for linkage purposes only (3.5). [ Example:
typedef struct { } *ps, S; // S is the class name for linkage purposes
因此,类型定义总是用作另一种类型的占位符/同义词。