Я думаю, что это сделано в основном из-за очень ошибочной идеи, что структура и тип не могут иметь одно и то же имя.Другими словами, это так или иначе
struct MyStruct;
typedef struct MyStruct MyStruct;
будет сталкиваться странным образом, потому что struct
и typedef
имеют одно и то же имя.Это неправильно в C. Имя структуры считается тегом , тогда как typedef создает имя типа.Они живут в двух разных пространствах имен и не будут сталкиваться.На мой взгляд, гораздо больше смысла в том, чтобы тег структуры совпадал с typedef, при условии, что вы вообще используете typedef.В C вы всегда должны ссылаться на структуру с ключевым словом struct.Например, если вы определяете
struct MyStruct;
, но не делаете typedef, то следующее недопустимо:
void myfunction()
{
MyStruct var; /* compiler error: MyStruct is not defined. */
struct MyStruct var2; /* this is OK, MyStruct is a valid name for a struct. */
}
Если вы хотите определить переменные (или аргументы) типа MyStruct
в C, вы должны предоставить typedef:
typedef struct MyStruct MyStruct;
void myfunction2()
{
MyStruct var; /* this is ok now */
struct MyStruct var2; /* this is still ok too */
}
Во втором примере var
и var2
имеют одинаковый тип,хотя это не очевидно.Действительно, если бы typedef был изменен, они больше не имели бы тот же тип.Остерегайтесь этого!Это может вызвать некоторые интересные ошибки при изменении определений типов.
В C ++ определение структуры по существу создает неявный typedef
, так что оба из приведенных выше фрагментов кода компилируются.В C ++ нет принципиальной разницы между именем структуры (или тегом) и именем типа.Что, на мой взгляд, является еще одной веской причиной для того, чтобы называть их одинаково, особенно если вы ожидаете, что ваш модуль C может в какой-то момент использоваться некоторым кодом C ++.