Ответ 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
по-прежнему полезен в С++ для других сложных конструкций типа, таких как указатели на функции.
Вероятно, вам следует рассмотреть некоторые вопросы на боковой панели Связанные, они объясняют некоторые другие нюансы этого вопроса.