Стиль 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 / обсуждение / программирование-указатели / 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).

Та же проблема / вопрос относится к объединениям и перечислениям.

13
задан Konrad Rudolph 2 March 2012 в 14:29
поделиться