Что ж, очевидная разница проявляется в вашем main
:
struct foo a;
bar b;
baz c;
Первое объявление имеет формат un- typedef
ed struct
и требует использования ключевого слова struct
.Второй имеет typedef
ed анонимный struct
, поэтому мы используем имя typedef
.Третий сочетает в себе как первое, так и второе: в вашем примере используется baz
(что удобно, если коротко), но с тем же эффектом можно использовать struct _baz
.
Обновление: ответ larsmans упоминает более распространенный случай, когда вы должны использовать хотя бы struct x { }
для создания связанного списка.Второй случай здесь невозможен (если вы не откажетесь от здравомыслия и вместо этого будете использовать void *
), поскольку struct
является анонимным, а typedef
не происходит до тех пор, пока не будет определен struct
, что не даст вамспособ сделать (типобезопасный) указатель на сам тип struct
.Первая версия отлично подходит для этого использования, но третья, как правило, предпочтительнее по моему опыту.Дайте ему несколько повторений за это.
Более тонкое различие заключается в размещении пространства имен.В C теги struct
размещаются в отдельном пространстве имен от других имен, а имена typedef
- нет.Таким образом, допустимо следующее:
struct test {
// contents
};
struct test *test() {
// contents
}
Но это не так, потому что было бы неоднозначно, как называется test
:
typedef struct {
// contents
} test;
test *test() {
// contents
}
typedef
делает имя короче(всегда плюс), но он помещает его в то же пространство имен, что и ваши переменные и функции.Обычно это не проблема, но это тонкое отличие от простого сокращения.