#cpp
На этот вопрос уже даны ответы здесь: Зачем нужен typedef? (2 ответа) Закрыт 2 года назад. В чем разница между typedef struct/class и пользовательским типом, созданным с помощью struct/class? Да, я понимаю, что typedef не создаёт новый тип, а делает всего лишь дополнительное имя для данного типа, но все таки, неужели создание типа так невыгодно? typedef: typedef struct { int size; int * massive; } MyStr; Тип: struct MyStr{ int size; int * massive; };
Ответы
Ответ 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 перед каждым объявлением.Ответ 2
Оба ваши примера эквиваленты, они объявляют два разных одинаковых типа. Объявления в виде typedef class/struct/union/enum пришли из Си и поддеживаются в Си++ для совместимости. Так как большое количество старых отлаженых библиотек написано на Си.
Комментариев нет:
Отправить комментарий