C ++中'struct'和'typedef struct'之间的区别?

為{幸葍}努か 提交于 2019-12-19 18:47:15

【推荐】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.3C99§6.2.3C11§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的答案

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!