Для чего нужны разные способы именования операторов typedef? - PullRequest
1 голос
/ 28 апреля 2020

У меня вопрос по поводу typedef оператора.

Здесь - это код, которым я всегда пишу это утверждение:

typedef struct name
{

}name_t;

А вот еще один пример того, как я могу написать это:

typedef struct
{

}name;

Вопрос в том, какова цель этих путей?

Ответы [ 3 ]

2 голосов
/ 28 апреля 2020

Вам необходимо использовать первый формат, если вам нужно обратиться к типу до завершения typedef. Это необходимо, если структура содержит указатель на тот же тип. Это происходит при определении связанных списков.

typedef struct name
{
    int value;
    struct name *next;
}name_t

Вы не можете использовать name_t *next; внутри объявления структуры, потому что name_t не определено до более позднего периода.

1 голос
/ 28 апреля 2020
typedef struct name
{
    int a;
    double b;
    char c;
}name_t;

name - это тег структуры, в то время как name_t - это новый тип, созданный typedef.

. Предоставлять тег структуры явно полезно, если:

  1. Вы хотите реализовать предварительное объявление структуры для использования ее в определениях функций или других структурах до определение структуры происходит (важно, если у вас есть несколько файлов перевода / C файлов).

Например:

Файл1. c

struct name;   // forward declaration of structure `name`.

void foo(struct name *ptr)
{
    ....
}

struct bar
{
   int x;
   struct name y;
}

Файл2. c

typedef struct name
{
    int a;
    double b;
    char c;
}name_t;
Вы хотите определить указатель на объект самой структуры внутри структуры, как требуется для связанных списков:
typedef struct name
{
    int a;
    double b;
    char c;
    struct name *next;    
}name_t;
1 голос
/ 28 апреля 2020
typedef struct name
{

}name_t;

name здесь - структурный тег, и он является лишним для обычного варианта использования, так как вы в конечном итоге получаете typedef в любом случае и с этого момента должны использовать только name_t в своем коде.

Единственная причина, по которой вы добавляете тег, это особый случай, когда вам нужна структура со ссылками на себя, такая как struct name* next; член в связанном списке или тому подобное. В таких случаях мы должны использовать тег struct, поскольку имя typedef нельзя использовать до выполнения самого оператора typedef. Другой альтернативой этому является предварительное объявление структуры.

_t именование является стандартным способом именования типов с незапамятных времен. К сожалению, стандарт POSIX имел ошибочную идею запретить такое именование, поэтому, если вы заботитесь о соответствии POSIX, вы не должны называть ваши типы с _t в конце. Если вас не волнует POSIX, вы должны использовать _t, потому что он дает правильный, самодокументированный код.

...