Вопросы об определениях структуры - PullRequest
0 голосов
/ 24 февраля 2020

Я новичок в c, у меня вопрос о структурах (см. Следующий код):

typedef struct student{
  char name[20];
  int grade;
} student1;

typedef struct group_project{
  char name_of_group[20];
  struct group_project *next;  // points to the next group
  student1 *student1;           //head of the group
} group_project;
  1. В чем разница между учеником и учеником1 (как называется структура?). Можете ли вы использовать то же имя?
  2. Зачем вам нужно добавлять "struct" при использовании group_project, но вы не добавляете struct при использовании структурной структуры студента?
  3. Можете ли вы использовать структуру без "typedef" "?

Ответы [ 2 ]

3 голосов
/ 24 февраля 2020

student1 - это псевдоним для типа struct student.

. А внутри структуры group_project псевдоним типа group_project еще не существует, поэтому вы должны использовать struct group_project .

А в C нельзя использовать имя тега структуры (например, student) без ключевого слова struct. Весь тип struct student.

0 голосов
/ 24 февраля 2020

В чем разница между student и student1 (как называется структура?). Можете ли вы использовать то же имя?

student - это структура тег или «имя» самой структуры, а student1 - это typedef d псевдоним типа struct student. Да, они могут иметь одно и то же имя или идентификатор , потому что они находятся в разных пространствах имен.

Зачем вам нужно добавлять "struct" при использовании group_project, но Вы не добавляете struct при использовании структуры student1?

В C, в отличие от C ++, когда вы определяете объект структуры, и не typedef d структура или определение объекта в объявлении самой структуры, вы должны предшествовать тегу структуры ключевым словом struct в объявлении соответствующего объекта, например:

struct student student_x;         // `struct` keyword required.

Поскольку student1 уже typedef d ранее, при объявлении структуры student вам больше не нужно использовать ключевое слово struct при определении объекта этого типа структуры.

В отличие от этого, group_project в качестве типа указателя next в структуре project_group должно предшествовать ключевое слово struct, поскольку после этого определяется typedef из group_project в исходном коде и не является действительным в данный момент времени внутри структуры.

Можно ли использовать структуру без "typedef"?

Да, конечно. Некоторые пользователи из сообщества даже говорят, что это еще более ценно, потому что это делает ваш код более читабельным. Я рекомендую всегда использовать структуру отдельно и не смешивать ее с любым typedef, даже если это требует немного большего набора клавиш, просто чтобы сделать ваш код немного более понятным, но это вопрос мнения и стиля. Здесь вы можете создать свой собственный образ:

typedef struct vs struct определений

Почему мы должны так часто вводить определение struct в C?

...