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;
但我经常看到代码样式如下:
-
typedef struct tagMyStruct {...} MyStruct;
- typedef struct myStruct {…} MyStruct;`
-
typedef struct _MyStruct {...} MyStruct;
<是的,我知道下划线+大写字母
在每种情况下,有人在某种程度上使标签名称与类型名称不同 。 它背后有什么实际原因吗?
旁注:我使用的是C ++编译器,但我想与这些定义C兼容(我知道这对c ++来说是不好的风格)。 出于维护某些调试工具的可用性的原因,我需要所有标记名称都是有意义的(不是自动生成的__unknown_something标记,如果是未命名的结构,您可以,例如,在visual studio类视图中查看)。
同样的问题/问题适用于工会和枚举。
语言方面,在C和C ++中完全没问题,因为标签名称存在于单独的名称空间(而不是namespace
)中。
在C ++中,使用typedef
绝对是不好的风格,因为它是多余的。 无论是否具有typedef
都可以使用MyStruct
和struct 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中经常键入一个结构? 讨论。