#cpp #c
Постоянно вижу в различных учебниках такой синтаксис объявления структур typedef struct Foo { int a; int b; int c; } Foo; Скажите, чем такой синтаксис отличается от банального? struct Foo { int a; int b; int c; };
Ответы
Ответ 1
В си типы структур и другие типы существуют в "разных пространствах имен". То есть, в си вполне можно написать так struct data { int foo; }; typedef int data; void foo() { struct data d1; data d2; } здесь и структура и тип синоним int имеют одинаковое имя. И это работает и компилируется. А уже в с++ - нет. Потому что в c типы находятся как бы в разных "таблицах". Что бы тип структуры был доступен и в "основном списке", нужно писать typedef. Но потом кто то придумал такой красивый синтаксис, так как писать постоянно struct надоело.Ответ 2
Ваш вопрос помечен тэгом [C++]. Но первый вариант объявления не несет практически никакой самостоятельной ценности в С++ коде. Первый вариант объявления часто применяется в С коде, но не в С++ коде. Первый вариант объявления может использоваться в качестве "общего знаменателя" в кросс-компилируемых заголовочных файлах, т.е. в заголовочных файлах, которые должны компилироваться как в С коде, так и в С++ коде. После такого объявления как в С коде, так и в С++ коде можно будет ссылаться на данный тип через его "короткое" имя Foo. В языке С++ такие объявления (объявляющие typedef-имя Foo в качестве псевдонима для уже существующего класса с точно таким же именем Foo) поддерживаются именно для обратной совместимости с языком С в кросс-компилируем коде.Ответ 3
С стиль: typedef struct Foo { int a; int b; int c; } Foo; без typedef нужно будет писать struct Foo foo; Кстати, в С чтобы объявить указатель на Foo нужно использоватьstruct Foo* typedef struct Foo { ... struct Foo*foo; } Foo; С++ стиль: struct Foo { int a; int b; int c; };Ответ 4
Тем, что при банальном синтаксисе везде надо тянуть слово struct, типа void func(struct Foo* f); а при небанальном достаточно void func(Foo* f); "По-моему, так" (с) Пух
Комментариев нет:
Отправить комментарий