Как говорят другие ответы, он определяет два, один определения типов с именем work_t
, который ссылается на struct work_tag
и другое название work_p
, который ссылается на struct work_tag*
.
Отметьте, что typedef
не создает новый тип. Все, что он делает, это создать псевдоним для существующего типа. struct work_tag
и work_t
не являются двумя подобными типами, это два имени для точно того же типа.
Теперь давайте обсудим, почему вы хотите это сделать.
Типы struct work_tag
и struct work_tag*
уже имеют совершенно хорошие имена. A typedef
дает вам возможность ссылаться на эти типы с использованием одного идентификатора, но, на мой взгляд, это действительно не очень выгодно. И typedef
для типа указателя на самом деле может быть немного опасным. Если вы хотите определить имя для действительно непрозрачного типа, где код, который его использует, не использует преимущества того факта, что это структура или указатель, typedef
- хорошее решение; в противном случае вы просто скрываете важную информацию.
Я бы просто написать:
struct work {
// contents
};
, а затем относятся к типу, как struct work
, и к указателю типа, как struct work*
.
Но если вы действительно чувствуете потребность иметь имя из одного слова для данного типа, нет необходимости использовать разные имена для тега и ЬурейиЙ:
typedef struct work {
// contents
} work;
Теперь вы можете обратиться к типу либо как struct work
, либо как work
, так и для указателя типа struct work*
или как work*
. (C++ делает это неявно; C не делает.) Обратите внимание, что если struct work
содержит указатель на другой struct work
, вы не можете использовать имя typedef внутри определения; имя typedef не становится видимым до конца определения.
Он не определяет новые типы; он определяет новые имена для существующих типов. –
@KeithThompson Вы правы. Я обновил свой ответ, чтобы избежать путаницы.Спасибо за ваш отзыв. – jcollado