typedef и пользовательский тип [дубликат]

261
02 ноября 2017, 07:27

На данный вопрос уже ответили:

  • Зачем нужен typedef? 2 ответа

В чем разница между typedef struct/class и пользовательским типом, созданным с помощью struct/class? Да, я понимаю, что typedef не создаёт новый тип, а делает всего лишь дополнительное имя для данного типа, но все таки, неужели создание типа так невыгодно? typedef:

    typedef struct {
        int   size;
        int * massive;
    } MyStr;

Тип:

    struct MyStr{
        int   size;
        int * massive;
    };
Answer 1

В Си++ разницы особой нет, разница есть в чистом Си. И в Си++ это используется, скорее, как пережиток Си. В языке Си есть 4 типа пространств имен: 1) Метки (используется в конструкциях goto) 2) Тэги (имена структур, объединений и перечислений) 3) Члены структур и объединений 4) Все остальное (имена функций, объектов, констант и все typedefы).

Так же стандарт Си требует (C11 6.2.3) раздельное пространство имен для каждой из этих категорий. Ну и все компиляторы и IDE в целом поддерживают этот стандарт. То есть, все эти элементы создаются в разных пространствах имен. Поэтому, например, такой код

struct myStruct {};
myStruct str;

не скомпилируется компилятором Си (но скомпилируется Си++), потому что тип myStruct находится в раздельном пространстве имен (не в том, в котором создается переменная str). Что бы такой код работал, str нужно объявлять так:

struct myStruct str;

Что бы не писать слово struct перед каждым объявлением переменной можно использовать прием с typedef. Т.к. все, что объявлено через typedef помещается в более общее пространство имен (в то же, где и все остальные объекты), то теперь нет необходимости писать слово struct перед каждым объявлением.

Answer 2

Оба ваши примера эквиваленты, они объявляют два разных одинаковых типа. Объявления в виде typedef class/struct/union/enum пришли из Си и поддеживаются в Си++ для совместимости. Так как большое количество старых отлаженых библиотек написано на Си.

READ ALSO
Количество компонент связности

Количество компонент связности

Данный код считает максимальную компоненту связностиКак найти их количество? Например,

311
Вызов operator[] через operator[] const

Вызов operator[] через operator[] const

Почему лучше вызывать константный operator[] из не константного operator[] а не наоборотЯ не вижу разницы между этими двумя способами

349
Что я делаю не так? C++ [требует правки]

Что я делаю не так? C++ [требует правки]

Перед тем, как задать switch, я пишу int a, дабы задать switch (a)

221