Typedef struct question - PullRequest
       3

Typedef struct question

3 голосов
/ 01 октября 2010

Зачем мне это делать?

typedef struct Frame_s
{
int x;
int y;
int z;
} Frame_t;

Кроме того, если я хочу создать объект, что мне использовать Frame_s или Frame_t?

Ответы [ 6 ]

6 голосов
/ 01 октября 2010

Вы бы использовали Frame_t.

С typedef вы говорите, что Frame_t и struct Frame_s точно такого же типа .

Такэто эквивалентные предложения:

// 1
Frame_t f;

// 2
struct Frame_s f;

Я бы использовал:

typedef struct
{
   int x;
   int y;
   int z;
} Frame_t;

И всегда объявлял мои переменные следующим образом:

Frame_t f1, f2, f3;

Путаница обычно происходит из мест, гдеВы используете это предложение в C ++ фрагменте кода.Если вы используете C ++ с этим typedef, вы можете использовать:

// 1
Frame_t f;

// 2
Frame_s f;

Но если вы используете простой C компилятор, то //2 недопустим.

2 голосов
/ 01 октября 2010

Либо вы используете struct Frame_s, либо вы используете Frame_t.

Обычно вы делаете такой typedef, чтобы вы могли использовать имя typedefed Frame_t, и вам не нужно было писать struct всякий раз, когда вы ссылаетесь на тип.

Кроме Frame_t короче struct Frame_s, нет никакой реальной разницы.

1 голос
/ 02 октября 2010

Другой аспект typedef, который еще не был упомянут в других ответах, заключается в том, что он резервирует идентификатор и, таким образом, может избежать путаницы.Если вы сделаете такое предварительное объявление

typedef struct Frame Frame;

, вам не следует использовать какой-либо код, который может использовать то же имя Frame, например, переменную или функцию.приходит на ум, это "sys / stat.h" в POSIX: он определяет struct stat и функцию stat:

int stat(const char *path, struct stat *buf);
0 голосов
/ 01 октября 2010

Итак, эти два объявления эквивалентны:

struct Frame_s f;
Frame_t f;

Фактически, теперь вы можете оставить Frame_s вне объявления, так как оно не нужно.

0 голосов
/ 01 октября 2010

typedef используется в качестве краткой формы.Поэтому, когда функция возвращает структуру этого типа, обычно вы пишете -

struct Frame_s *function_name()

Код начинает запутываться.Определения функций становятся длинными и т. Д. С этим typedef вы получаете -

Frame_t *function_name()

Чистый код!Имеет большое значение в обслуживании ...

0 голосов
/ 01 октября 2010

Чтобы объявить значение структуры, вы можете использовать либо struct Frame_s foo, либо Frame_t foo (последняя более нормальная, поскольку в этом весь смысл определения типа).Я предполагаю, что Frame_s предназначен для указания самого типа структуры, в то время как Frame_t является простым типом, который обычно используется для значений Frame.

...