Постоянно вижу в различных учебниках такой синтаксис объявления структур
typedef struct Foo {
int a;
int b;
int c;
} Foo;
Скажите, чем такой синтаксис отличается от банального?
struct Foo {
int a;
int b;
int c;
};
В си типы структур и другие типы существуют в "разных пространствах имен". То есть, в си вполне можно написать так
struct data {
int foo;
};
typedef int data;
void foo()
{
struct data d1;
data d2;
}
здесь и структура и тип синоним int имеют одинаковое имя. И это работает и компилируется. А уже в с++ - нет. Потому что в c типы находятся как бы в разных "таблицах".
Что бы тип структуры был доступен и в "основном списке", нужно писать typedef. Но потом кто то придумал такой красивый синтаксис, так как писать постоянно struct надоело.
Ваш вопрос помечен тэгом [C++]. Но первый вариант объявления не несет практически никакой самостоятельной ценности в С++ коде. Первый вариант объявления часто применяется в С коде, но не в С++ коде.
Первый вариант объявления может использоваться в качестве "общего знаменателя" в кросс-компилируемых заголовочных файлах, т.е. в заголовочных файлах, которые должны компилироваться как в С коде, так и в С++ коде. После такого объявления как в С коде, так и в С++ коде можно будет ссылаться на данный тип через его "короткое" имя Foo
.
В языке С++ такие объявления (объявляющие typedef-имя Foo
в качестве псевдонима для уже существующего класса с точно таким же именем Foo
) поддерживаются именно для обратной совместимости с языком С в кросс-компилируем коде.
С стиль:
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;
};
Тем, что при банальном синтаксисе везде надо тянуть слово struct
, типа
void func(struct Foo* f);
а при небанальном достаточно
void func(Foo* f);
"По-моему, так" (с) Пух
Виртуальный выделенный сервер (VDS) становится отличным выбором
Не пойму как правильно перегрузить оператор "-" для класса массиваОписание класса:
Похоже, я зашел в тупикПонемногу разбираюсь с программированием графики, решил попробовать реализовать тени альтернативным shadow-mapping'у способом,...
std::vector<type> насколько я понимаю , написав определенный type, то элементами моего вектора могут быть только этого типаА можно ли сделать так...
Хочу написать программу, которая будет проверять частоту кадров любого приложенияМоей целью является залогировать FPS и время каждого кадра