Структура структуры?

Возможный дубликат:
Разница между «struct» и «typedef struct» в C ++?

Может кто-нибудь объяснить, в чем разница между следующими определениями Struct

typedef struct
{
}GOOD;

&

struct GOOD
{
};

&

typedef struct tagGOOD
{
}GOOD;

Мой учитель использует последний пример, но я действительно не знаю, почему он использует «тег» в имени структуры (если это имя), может кто-нибудь объяснить это, пожалуйста?

0

Решение

Структуры должны иметь название:

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;
1

Другие решения

В C и C ++, любой struct Вы объявляете с именем может упоминаться как struct GOOD, Вы также можете объявить анонимные структуры, которые не имеют имени, как это было сделано в первом примере.

Любой тип может быть typedefдал бы ему альтернативное имя. В первом примере вы просто даете имя GOOD (без struct) анонимной структуре. Во втором примере ваша структура может быть доступна только как struct GOOD, В третьих, вы можете получить к нему доступ как GOOD или же struct GOOD,

Все три варианта являются законными, и какой из них использовать, это вопрос стиля.

2

Во всем коде, который я прочитал за эти годы, я видел, как использовались все эти варианты. Я только что проверил в VS2010, и они, казалось, были эквивалентны. Однако я могу сказать, что ключевое слово typedef раньше требовалось в C, но больше не в C ++.

2

Если вы говорите о 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

Определение 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 довольно бессмысленна.

0
По вопросам рекламы [email protected]