Корректность стиля C / C ++, является ли тег struct / union / enum таким же, как имя типа, каким-либо образом плохим? - PullRequest
13 голосов
/ 02 марта 2012

Следующее определение 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; <да, я знаю о подчеркивании + заглавная буква </li>

В каждом случае кто-то в той или иной степени пытался сделать имя тега отличным от имени типа. Есть ли за этим практические причины?

Примечание: я использую компилятор C ++, но я хотел бы быть совместимым с C с этими определениями (я знаю, что это плохой стиль для c ++). В целях обеспечения удобства использования некоторых инструментов отладки мне нужно, чтобы все имена тегов были осмысленными (а не автоматически генерируемые теги __unknown_something в случае неназванных структур, которые можно, например, увидеть в представлении классов Visual Studio).

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

Ответы [ 4 ]

5 голосов
/ 02 марта 2012

С точки зрения языка это нормально, как в C, так и в C ++, поскольку имена тегов существуют в отдельном пространстве имен (не namespace).

В C ++ это определенно плохой стиль - использовать typedef вообще, так как он избыточен.Вы можете использовать как MyStruct, так и struct MyStruct, независимо от того, есть у вас typedef или нет.

Если вы считаете, что совместимость с C важнее стиля C ++, это ваш выбор.: -)

0 голосов
/ 20 августа 2015

Поскольку C (может быть) реализован однопроходным компилятором, самостоятельная ссылка на typedef, когда он не создан, является ошибкой. Например, это неверно,

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

Таким образом,

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

когда вы хотите обозначить его как Foo, а не struct Foo. См. Почему мы должны так часто определять структуру в C? для обсуждения.

0 голосов
/ 02 марта 2012

Технически, нет причин, по которым имена должны быть разными, и было написано много кода с использованием одного и того же имени для обоих идентификаторов. Важно быть последовательным в своем собственном коде.

Можно утверждать, что чрезмерное использование typedef загрязняет пространство имен, и это может быть правдой. Эмпирическое правило, которое я использую, таково: если я собираюсь часто его использовать, используйте typedef, если нет.

Кроме того, если я использую typedef, я не называю struct, поэтому я буду кодировать его так:

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

Таким образом, я должен использовать его последовательно, а последовательность - это ключ к хорошему стилю кодирования.

0 голосов
/ 02 марта 2012

struct Foo объявляет struct в другом пространстве имен.Таким образом, «struct Foo» и «Foo» не могут вмешиваться.

Причина выполнения typedef struct _foo {} foo; мне не очень понятна.Может быть, это реликт определения типа указателя (typedef struct _foo {} foo, *Pfoo;).

...