Возможный дубликат:
Разница между «struct» и «typedef struct» в C ++?
Может кто-нибудь объяснить, в чем разница между следующими определениями Struct
typedef struct
{
}GOOD;
&
struct GOOD
{
};
&
typedef struct tagGOOD
{
}GOOD;
Мой учитель использует последний пример, но я действительно не знаю, почему он использует «тег» в имени структуры (если это имя), может кто-нибудь объяснить это, пожалуйста?
Структуры должны иметь название:
struct StructName {
// stuff
};
Typedefs берет тип и дает ему имя:
typedef SomeType NameYouWannaGiveThatType;
Третий пример объединяет их.
Примером является безымянная структура, о которой некоторые компиляторы расстраиваются.
Второй пример — именованная структура, но вы традиционно не могли бы ссылаться на нее, не включая слово struct. например
struct MyStruct {
//...
};
MyStruct iffy; // Not allowed in C, in my experience anyway
struct MyStruct good; // No problem.
Я не нашел, чтобы это было проблемой в C ++, но я уверен, что есть люди, которые знают спецификацию C ++ в обратном направлении и дадут вам лучший ответ. В любом случае, вы можете обойти это с помощью typedef.
typedef MyStruct { /* etc */ } MyStruct;
MyStruct s;
Лично, и это, вероятно, просто вопрос стиля, я предпочитаю не использовать одно и то же имя:
typedef MyStruct { /* etc */ } SMyStruct;
В C и C ++, любой struct
Вы объявляете с именем может упоминаться как struct GOOD
, Вы также можете объявить анонимные структуры, которые не имеют имени, как это было сделано в первом примере.
Любой тип может быть typedef
дал бы ему альтернативное имя. В первом примере вы просто даете имя GOOD
(без struct
) анонимной структуре. Во втором примере ваша структура может быть доступна только как struct GOOD
, В третьих, вы можете получить к нему доступ как GOOD
или же struct GOOD
,
Все три варианта являются законными, и какой из них использовать, это вопрос стиля.
Во всем коде, который я прочитал за эти годы, я видел, как использовались все эти варианты. Я только что проверил в VS2010, и они, казалось, были эквивалентны. Однако я могу сказать, что ключевое слово typedef раньше требовалось в C, но больше не в C ++.
Если вы говорите о C ++, я считаю, что typedef на самом деле не нужен. История на самом деле происходит от C.
в C, когда я объявляю
struct GOOD_STRUCT {
...
}
Когда я хочу объявить переменную этой структуры, мне нужно сделать
struct GOOD_STRUCT good;
Чтобы иметь лучший стиль кодирования и удобочитаемость, люди использовали для этого следующее определение:
typedef GOOD_STRUCT GOOD;
так что вы можете сделать
GOOD good;
Чтобы объединить оба, люди привыкли делать
typedef struct GOOD_STRUCT {
...
} GOOD;
или же
typedef struct {
...
} GOOD;
Однако в C ++ это больше не нужно. Как только вы объявите struct GOOD
, вы уже можете отослать его по GOOD
непосредственно.
Определение 1:
Определяет анонимную (пустую) структуру и дает ей определение типа GOOD
, Этот тип можно назвать просто GOOD
в будущем.
Определение 2:
Определяет (пустую) структуру с именем GOOD
, В C и C ++ это можно назвать struct GOOD
и в C ++ это можно назвать GOOD
,
Определение 3:
Определяет (пустую) структуру с именем tagGOOD
и определение типа с именем GOOD
, В C и C ++ структура может упоминаться как struct tagGOOD
а также GOOD
и в C ++ это можно назвать tagGOOD
,
Определение 3 имеет тенденцию быть самым распространенным в коде C в моем опыте. Людям не очень нравятся анонимные структуры, поэтому они дают структуре имя, но им также не нравится использовать struct
ключевое слово при обращении к типу, поэтому они также дают ему определение типа. В C ++ форма typedef довольно бессмысленна.