【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
在C ++中,之间有什么区别:
struct Foo { ... };
和
typedef struct { ... } Foo;
#1楼
您不能对typedef结构使用forward声明。
struct本身是一个匿名类型,因此您没有实际名称来转发声明。
typedef struct{
int one;
int two;
}myStruct;
像这样的前瞻声明不会起作用:
struct myStruct; //forward declaration fails
void blah(myStruct* pStruct);
//error C2371: 'myStruct' : redefinition; different basic types
#2楼
C ++中'typedef struct'和'struct'之间的一个重要区别是'typedef structs'中的内联成员初始化将不起作用。
// 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; };
#3楼
Struct是创建数据类型。 typedef用于设置数据类型的昵称。
#4楼
C ++没有区别,但是我相信它会允许你在不明确地执行的情况下声明struct Foo的实例:
struct Foo bar;
#5楼
在C ++中,只有一个微妙的区别。 这是C的延续,它有所作为。
C语言标准( C89§3.1.2.3 , C99§6.2.3和C11§6.2.3 )要求为不同类别的标识符分别命名空间,包括标记标识符 (用于struct
/ union
/ enum
)和普通标识符 (用于typedef
和其他标识符)。
如果你刚才说:
struct Foo { ... };
Foo x;
您会收到编译器错误,因为Foo
仅在标记名称空间中定义。
您必须将其声明为:
struct Foo x;
每当你想要引用Foo
,你总是要把它称为struct Foo
。 这会很快烦人,所以你可以添加一个typedef
:
struct Foo { ... };
typedef struct Foo Foo;
现在struct Foo
(在标记命名空间中)和普通Foo
(在普通标识符命名空间中)都引用相同的东西,并且您可以在没有struct
关键字的情况下自由声明Foo
类型的对象。
构造:
typedef struct Foo { ... } Foo;
只是声明和typedef
的缩写。
最后,
typedef struct { ... } Foo;
声明一个匿名结构并为其创建一个typedef
。 因此,使用此构造,它在标记名称空间中没有名称,只有typedef名称空间中的名称。 这意味着它也无法向前宣布。 如果要进行前向声明,则必须在标记名称空间中为其指定名称 。
在C ++中,所有struct
/ union
/ enum
/ class
声明都像隐式typedef
一样,只要该名称不被另一个具有相同名称的声明隐藏。 有关详细信息,请参阅Michael Burr的答案 。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3145062