Ответ 1
В C есть две возможности объявить структуру:
struct STRUCT_NAME {} ;
или
typedef struct {} STRUCT_ALIAS;
Если вы используете первый метод (укажите struct name) - вы должны определить переменную, указав ее явно a struct
:
struct STRUCT_NAME myStruct;
Однако, если вы используете второй метод (укажите struct a alias), вы можете опустить struct
identifier - компилятор может вывести тип переменной, если только он alias
:
STRUCT_ALIAS myStruct;
Бонусные баллы: Вы можете объявить структуру с именем и псевдонимом:
typedef struct STRUCT_TAG {} STRUCT_TAG;
// here STRUCT_NAME == STRUCT_ALIAS
Затем в определении переменной вы можете использовать первый или второй метод. Почему оба двух мира хороши? Атрибут Struct позволяет вам сделать определения переменных структуры короче - что иногда бывает хорошо. Но имя структуры позволяет вам сделать forward declarations
. Это незаменимый инструмент в некоторых случаях - считайте, что у вас есть круговые ссылки между структурами:
struct A {
struct B * b;
}
struct B {
struct A * a;
}
Кроме того, эта архитектура может быть ошибочной - это круговое определение будет скомпилировано, когда структуры будут объявлены первым способом (с именами). И указатели на конструкцию будут указаны явно, пометив их как struct
.