C样式/ C ++的正确性,是struct / union / enum标签与类型名称相同吗?

以下MyStruct(标记MyStruct)的定义和MyStruct类型的类型定义似乎完全可以通过gcc(至少4.6.2)和g ++来完成。

typedef struct MyStruct { int a; int b; } MyStruct; 

我的问题是:它是否容易出错(在C和/或C ++中)或使用标签名称与类型名称相同的错误样式?

根据http://www.eetimes.com/discussion/programming-pointers/4024450/Tag-vs-Type-Names,它不是:

我永远不明白为什么他们为标签和typedef使用不同的名称时,一个名称就可以了:

 typedef struct tree_node tree_node; 

但我经常看到代码样式如下:

  1. typedef struct tagMyStruct {...} MyStruct;
  2. typedef struct myStruct {…} MyStruct;`
  3. typedef struct _MyStruct {...} MyStruct; <是的,我知道下划线+大写字母

在每种情况下,有人在某种程度上使标签名称类型名称不同 。 它背后有什么实际原因吗?

旁注:我使用的是C ++编译器,但我想与这些定义C兼容(我知道这对c ++来说是不好的风格)。 出于维护某些调试工具的可用性的原因,我需要所有标记名称都是有意义的(不是自动生成的__unknown_something标记,如果是未命名的结构,您可以,例如,在visual studio类视图中查看)。

同样的问题/问题适用于工会和枚举。

语言方面,在C和C ++中完全没问题,因为标签名称存在于单独的名称空间(而不是namespace )中。

在C ++中,使用typedef绝对是不好的风格,因为它是多余的。 无论是否具有typedef都可以使用MyStructstruct MyStruct

如果您认为C兼容性比C ++样式更重要,那么这是您的选择。 🙂

‘struct Foo’在不同的命名空间中声明struct。 所以,’struct Foo’和’Foo’不能干涉。

typedef struct _foo {} foo; 对我来说不是很清楚。 也许它是指针的残留( typedef struct _foo {} foo, *Pfoo; )typedefing。

从技术上讲,没有理由说名称需要不同,并且为两个标识符使用相同的名称编写了大量代码。 重要的是在您自己的代码中保持一致。

可以说,过度使用typedef污染命名空间,这可能是真的。 我使用的经验法则是:如果我要使用它很多,请使用typedef ,如果不是的话。

另外,如果我使用的是typedef我没有命名struct ,所以我会像这样编码:

 typedef struct { int a; int b; } struct_t; 

这样我必须始终如一地使用它,一致性是良好编码风格的关键。

因为C(可以)实现了一次通过编译器,所以在未创建时自引用typedef是一个错误。 例如,这是无效的,

 typedef struct { Foo *next; int i; } Foo; 

从而,

 typedef struct tagFoo { struct tagFoo *next; int i; } Foo; 

当你想把它称为Foo而不是struct Foo 。 请参阅为什么我们应该在C中经常键入一个结构? 讨论。