2012-01-18 1 views
4

Я понимаю всю типизацию структуры в понятии C, чтобы вы могли избежать использования ключевого слова struct всякий раз, когда используете его. Я все еще немного смущен тем, что здесь происходит.Что именно делает этот синтаксис? (по отношению к структурам c-стиля)

Может ли кто-нибудь сказать мне, что такое определение этой структуры?

typedef struct work_tag { 
    //contents. 
} work_t, *work_p; 

ответ

9

Он определяет два определений типов, как:

typedef struct work_tag { 
    //contents. 
} work_t; 

typedef struct work_tag *work_p; 
1

Это назначение двух альтернативных имен существующих типов:

work_t -> struct work_tag 
work_p -> struct work_tag * 
+0

Он не определяет новые типы; он определяет новые имена для существующих типов. –

+0

@KeithThompson Вы правы. Я обновил свой ответ, чтобы избежать путаницы.Спасибо за ваш отзыв. – jcollado

2

думать о typedef как при объявлении переменной. Так же, как вы можете сделать int a, b, чтобы сделать две переменные int, вы можете сделать typedef int a_t, b_t, чтобы сделать два типа в одном typedef.

3

Как говорят другие ответы, он определяет два, один определения типов с именем 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 не становится видимым до конца определения.

Смежные вопросы