Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Объявление структуры С++ с typedef

#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); "По-моему, так" (с) Пух

Комментариев нет:

Отправить комментарий