typedef struct vs struct definitions

在C ++中,只有细微的差别。这是C的遗留物,在其中有所作为。

C语言标准(C89§3.1.2.3C99§6.2.3C11§6.2.3)为不同类别的标识符(包括标记标识符(用于structunionenum)和普通标识符(for typedef和其他标识符))规定了单独的命名空间。。

如果您只是说:

struct Foo { ... };
Foo x;

您将得到一个编译器错误,因为Foo它仅在标记名称空间中定义。

您必须将其声明为

struct Foo x;

每当您要引用a时Foo,都必须始终将其称为struct Foo。快速变得烦人,因此您可以添加typedef

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

现在struct Foo(在标记名称空间中)和仅普通的 Foo(在普通标识符名称空间中)都引用相同的内容,并且您可以自由地声明Foo没有struct关键字的类型的对象。

构造:

typedef struct Foo { ... } Foo;

最后,

typedef struct { ... } Foo;

声明一个匿名结构并typedef为其创建一个。因此,使用此构造,它在标签名称空间中没有名称,而在typedef名称空间中只有名称。这意味着它也不能被预先声明。 如果要进行前向声明,则必须在标签命名空间中为其命名


在C ++中,所有structunionenumclass声明像他们是隐式typedef“版,只要名称不与另一个同名的声明所隐藏。有关完整的详细信息,请参见Michael Burr的答案

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值