Страницы

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

суббота, 11 января 2020 г.

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

#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 пришли из Си и поддеживаются в Си++ для совместимости. Так как большое количество старых отлаженых библиотек написано на Си.

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

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