C структурирует против typedef struct вопрос - PullRequest
1 голос
/ 04 августа 2011

Так что мой вопрос многогранен.

В целях понимания C (не C ++) я считаю, что следующий код:

struct Foo { int bar; }; 

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

typedef Foo { int bar; };

Единственное различие, которое я видел, состоит в том, должен ли я использовать ключевое слово "struct" перед переменной типа Foo.Какие различия вызывают это поведение?

Ответы [ 4 ]

6 голосов
/ 04 августа 2011

struct вводит новый тип, но typedef просто создает псевдоним для другого типа.Это объявление создает новый тип с именем struct Foo:

struct Foo { int bar; }; 

Это объявление просто недопустимо:

typedef Foo { int bar; };

Однако это объявление является действительным и создает новый безымянный тип,а также создает псевдоним для этого типа с именем Foo:

typedef struct { int bar; } Foo;

Вы также можете создать псевдоним для именованного типа - это создает псевдоним для типа struct Foo с именем Foo:

typedef struct Foo Foo;

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

Вы можете создать псевдонимы для любоготипы, в том числе встроенные.Например, вы можете создать псевдоним для int с именем Foo:

typedef int Foo;
6 голосов
/ 04 августа 2011

Разница:

struct Foo { int bar; }; 

создает тип структуры { int bar; } с именем Foo.Т.е. полное имя типа struct Foo.

typedef Foo { int bar; };

создает псевдоним Foo для безымянного типа структуры { int bar; }

Однако я не уверен, что ваш синтаксис полностью правильный для строгого C, но как-то это нормально для вашего компилятора.Или это создает что-то другое, но случайно это работает, синтаксис C может быть очень хитрым.В любом случае второе утверждение должно быть:

typedef struct { int bar; } Foo;

Для дальнейшего использования вы можете использовать это .

1 голос
/ 04 августа 2011

Я считаю, что ваш синтаксис неверен.typedef Foo { int bar; }; должно быть typedef Foo { int bar; } MyFoo;

Причина, по которой люди будут использовать typedef, заключается в том, что они могут отбросить структуру в объявлениях.Т.е.:

struct Foo myFoo;
//vs.
MyFoo myFoo;
0 голосов
/ 04 августа 2011

когда я собираюсь скомпилировать этот код

typedef Foo { int bar; };

это говорит об ошибке компиляции

error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
...