Объявления Typedef/struct

В чем разница между этими двумя объявлениями, если кто-то может объяснить подробно:

typedef struct atom {
  int element;
  struct atom *next;
};

и

typedef struct {
  int element;
  struct atom *next;
} atom;

Ответ 1

Цель typedef - дать имя спецификации типа. Синтаксис:

typedef <specification> <name>;

После того, как вы это сделали, вы можете использовать <name> так же, как любой из встроенных типов языка для объявления переменных.

В вашем первом примере вы <specification> - это все, начиная с struct atom, но после него нет <name>. Таким образом, вы не указали новое имя спецификации типа.

Использование имени в объявлении struct не совпадает с определением нового типа. Если вы хотите использовать это имя, вам всегда следует предшествовать ключевое слово struct. Поэтому, если вы заявляете:

struct atom {
    ...
};

Вы можете объявить новые переменные с помощью:

struct atom my_atom;

но вы не можете просто объявить

atom my_atom;

Для последнего вы должны использовать typedef.

Обратите внимание, что это одна из заметных отличий между C и С++. В С++ объявление типа struct или class позволяет вам использовать его в объявлениях переменных, вам не нужен typedef. typedef по-прежнему полезен в С++ для других сложных конструкций типа, таких как указатели на функции.

Вероятно, вам следует рассмотреть некоторые вопросы на боковой панели Связанные, они объясняют некоторые другие нюансы этого вопроса.

Ответ 2

Это обычный structure declaration

  struct atom {
      int element;
      struct atom *next;
    };    //just declaration

создание object

 struct atom object; 

  struct atom {
      int element;
      struct atom *next;
    }object;    //creation of object along with structure declaration

и

Это определение типа struct atom type

typedef  struct atom {
  int element;
  struct atom *next;
}atom_t;  //creating new type

Здесь atom_t является псевдонимом для struct atom

создание объекта

atom_t object;      
struct atom object; //both the ways are allowed and same

Ответ 3

Общий синтаксис ключевого слова typedef будет следующим: typedef existing_data_type new_data_type;

typedef struct Record {
    char ename[30];
     int ssn;
    int deptno;
} employee;