Просто не понимаю смысл этих typedefs - PullRequest
1 голос
/ 26 января 2012

При попытке обнаружить что-то в коде некоторых проектов на C с открытым исходным кодом я часто вижу такой тип typedef:

typedef struct _StructA StructA;
typedef struct _LinusTorvalds LinusTorvalds;

Почему бы не определить и не использовать непосредственно StructA, просто StructA вместо определения _ StructA , а затем "typedef"?
Какой смысл этой техники "_"?

Ответы [ 4 ]

7 голосов
/ 26 января 2012

В C структура должна использоваться как:

struct _StructA my_variable;

… т.е. вы должны вводить struct не только при определении struct, но и каждый раз, когда вы его используете. typedef исключает ввод struct при его использовании (но не при его определении: устранить это невозможно). С typedef тогда объявление экземпляра struct становится:

StructA my_variable;

Теперь, это не полностью объясняет бизнес _StructA / StructA в определении struct / typedef, как вы можете сделать это:

typedef struct {
    ...
} StructA;

… вот, мы берем анонимный struct и сразу переводим его на typedef. Но используя этот метод, вы не можете использовать struct внутри себя, так как у него (пока) нет имени. Для этого вам нужно что-то вроде:

typedef struct _Foo {
    int data;
    struct _Foo *next;
} Foo;
3 голосов
/ 26 января 2012

В C, когда вы определяете тип структуры:

struct StructA {
    int foo;
    double bar;
};

имя типа struct StructA, а не просто StructA. (C ++ позволяет ссылаться на тип просто как StructA; C ++ - это другой язык.

Если вы настаиваете на наличии имени из одного слова, вы можете использовать typedef (который, следует отметить, создает новое имя для существующего типа, а не новый тип):

typedef struct StructA StructA;

Теперь вы можете ссылаться на тип либо как StructA, либо как struct StructA.

Их можно объединить в одну декларацию:

typedef struct StructA {
    int foo;
    double bar;
} StructA;

Обратите внимание, что я использовал один и тот же идентификатор для тега struct и для typedef. Поскольку они находятся в разных пространствах имен, это совершенно правильно.

С другой стороны, я предпочитаю вообще не указывать typedef и просто ссылаться на тип как struct StructA.

Кстати, имена _StructA и _LinusTorvalds в вашем вопросе зарезервированы для реализации и не должны использоваться в вашем собственном коде. Как правило, следует избегать идентификаторов, начинающихся с подчеркивания. (Использование таких идентификаторов не редкость, но это неправильно, если только код не является частью самой реализации C).

Подводя итог: typedef необходим, только если вы хотите, чтобы имя типа имело одно слово (что на самом деле не требуется) - и если вы используете typedef, нет реальной причины использовать разные идентификаторы для typedef и тега struct.

1 голос
/ 26 января 2012

Это позволяет не использовать ключевое слово struct каждый раз, когда вы объявляете переменные структуры.

без typedef:

struct _StructA obj;

С typedef:

StructA obj;
0 голосов
/ 26 января 2012

Это может уменьшить зависимость от определенной структуры данных. Например. если вы когда-нибудь захотите использовать StructB (может содержать больше полей) вместо StructA, вам нужно изменить только одну строку, а не сотни.

...