struct
вводит новый тип, но typedef
просто создает псевдоним для другого типа.Это объявление создает новый тип с именем struct Foo
:
struct Foo { int bar; };
Это объявление просто недопустимо:
typedef Foo { int bar; };
Однако это объявление является действительным и создает новый безымянный тип,а также создает псевдоним для этого типа с именем Foo
:
typedef struct { int bar; } Foo;
Вы также можете создать псевдоним для именованного типа - это создает псевдоним для типа struct Foo
с именем Foo
:
typedef struct Foo Foo;
Эти два имени полностью взаимозаменяемы - вы можете передать struct Foo
в функцию, объявленную, например, как принимающую аргумент типа Foo
.
Вы можете создать псевдонимы для любоготипы, в том числе встроенные.Например, вы можете создать псевдоним для int
с именем Foo
:
typedef int Foo;