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

119
18 августа 2019, 02:50

Постоянно вижу в различных учебниках такой синтаксис объявления структур

typedef struct Foo {
    int a;
    int b;
    int c;
} Foo;

Скажите, чем такой синтаксис отличается от банального?

struct Foo {
    int a;
    int b;
    int c;
};
Answer 1

В си типы структур и другие типы существуют в "разных пространствах имен". То есть, в си вполне можно написать так

struct data {
    int foo;
};
typedef int data;
void foo()
{
    struct data d1;
    data d2;
}

здесь и структура и тип синоним int имеют одинаковое имя. И это работает и компилируется. А уже в с++ - нет. Потому что в c типы находятся как бы в разных "таблицах".

Что бы тип структуры был доступен и в "основном списке", нужно писать typedef. Но потом кто то придумал такой красивый синтаксис, так как писать постоянно struct надоело.

Answer 2

Ваш вопрос помечен тэгом [C++]. Но первый вариант объявления не несет практически никакой самостоятельной ценности в С++ коде. Первый вариант объявления часто применяется в С коде, но не в С++ коде.

Первый вариант объявления может использоваться в качестве "общего знаменателя" в кросс-компилируемых заголовочных файлах, т.е. в заголовочных файлах, которые должны компилироваться как в С коде, так и в С++ коде. После такого объявления как в С коде, так и в С++ коде можно будет ссылаться на данный тип через его "короткое" имя Foo.

В языке С++ такие объявления (объявляющие typedef-имя Foo в качестве псевдонима для уже существующего класса с точно таким же именем Foo) поддерживаются именно для обратной совместимости с языком С в кросс-компилируем коде.

Answer 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;
};
Answer 4

Тем, что при банальном синтаксисе везде надо тянуть слово struct, типа

void func(struct Foo* f);

а при небанальном достаточно

void func(Foo* f);

"По-моему, так" (с) Пух

READ ALSO
Проблема при перегрузке оператора “-”

Проблема при перегрузке оператора “-”

Не пойму как правильно перегрузить оператор "-" для класса массиваОписание класса:

138
Тени при помощи теневых объемов (shadow volumes)

Тени при помощи теневых объемов (shadow volumes)

Похоже, я зашел в тупикПонемногу разбираюсь с программированием графики, решил попробовать реализовать тени альтернативным shadow-mapping'у способом,...

128
Тип элементов вектора. С++

Тип элементов вектора. С++

std::vector<type> насколько я понимаю , написав определенный type, то элементами моего вектора могут быть только этого типаА можно ли сделать так...

109
C# получить время кадра любого приложения, использующего GPU

C# получить время кадра любого приложения, использующего GPU

Хочу написать программу, которая будет проверять частоту кадров любого приложенияМоей целью является залогировать FPS и время каждого кадра

99