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

ved*_*ved 13 c c++ coding-style typedef

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

typedef struct MyStruct {
  int a;
  int b;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)

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

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

我永远不明白为什么他们为标签和typedef使用不同的名称,当一个名称做得很好时:

typedef struct tree_node tree_node;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Bo *_*son 5

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

在C++中,使用它绝对是一种糟糕的风格typedef,因为它是多余的.您可以同时使用MyStruct以及struct MyStruct你是否有typedef或没有.

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

  • "因为它是多余的" - 正式地说它不是多余的,因为它有所不同.使用它可以阻止一些小丑声明一个名为`MyStruct`的函数(或其他实体).在实践中,你只指望人们不要那么致力于在工作场所开玩笑. (5认同)