Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Почему в заголовочных файлах структуры объявляют с кл. словом typedef?  (Прочитано 13101 раз)
0 Пользователей и 1 Гость смотрят эту тему.
NBPNBP
Интересующийся

es
Offline Offline

« : 10-07-2012 13:57 » 

 Здраствуйте! Объясните пожалуйста, почему в заг. файлах структуры объявляют с кл. словом typedef?
Например:    typedef struct  _SECURITY_ATTRIBUTES {
                                                                                          DWORD nLength;
                                                                                          LPVOID lpSecurityDescriptor;
                                                                                          BOOL bInheritHandle;
                                                                                      } SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;

почему не просто:  struct  _SECURITY_ATTRIBUTES {
                                                                                    DWORD nLength;
                                                                                    LPVOID lpSecurityDescriptor;
                                                                                    BOOL bInheritHandle;
                                                                                   } SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;

какая между этими объявлениями разница? И зачем сразуже создаются экземпляры этой структуры ( в данном случае SECURITY_ATTRIBUTES и *PSECURITY_ATTRIBUTES?
Спасибо!
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 10-07-2012 14:21 » 

"SECURITY_ATTRIBUTES" и "PSECURITY_ATTRIBUTES" - не экземпляры, а новые имена типов. Само название директивы typedef разве не наводит на мысль (TYPE DEFine - задать тип)?

Вот две небольшие статьи в тему:
https://club.shelek.ru/viewart.php?id=269
https://club.shelek.ru/viewart.php?id=270
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 10-07-2012 14:26 » 

Разница, как уже указал RXL, в том, что первое объявляет псевдонимы для типа, а второе - переменные данного типа.
Нужно оно в таком виде затем, чтобы одной строчкой задать имена для типа самой структуры и указателя на структуру. Так проще понять, что к чему относится. Больше порядка, в общем. Плюс, структура изначально не обязана быть именованной, псевдонимы и для неименованной можно создавать.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 10-07-2012 16:11 » 

NBPNBP, по старым правилам языка C (не C++) ключевое слово struct является неотъемлемым элементом типа.

Код: (C)
/* Описание пользовательского тип struct S. */
struct S {
  int x;
};

/* Объявление переменной типа. */
struct S s;
/* S s; - неправильно для C, но правильно для C++. */
/* Объявление указателя типа. */
struct S *p = &s;

Переменную можно объявить сразу после описания типа:
Код: (C)
struct S {
  int x;
} s;
или для указателя:
Код: (C)
struct S {
  int x;
} *p;

Чтобы не надо было тащить за собой слово struct, можно использовать определение типа с помощью конструкции typedef:
Код:
typedef <имеющийся тип> <идентификатор 1 нового типа>[, <идентификатор 2 нового типа>[, ...]];

Получится:
Код: (C)
/* Описание пользовательских типов struct _S и S. */
typedef struct _S {
  int x;
} S, *PtrS;


/* Объявление переменных типа. */
struct _S s1;
S s2; /* так короче */
/* Объявление указателей типа. */
struct _S *p1 = &s1;
S *p2 = &s2; /* так короче */
PtrS p3 = p2; /* так тоже коротко */
« Последнее редактирование: 10-07-2012 16:12 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 10-07-2012 20:40 » 

Плюс, структура изначально не обязана быть именованной, псевдонимы и для неименованной можно создавать.

Немного не в тему: как для неименнованной структуры задать конструктор?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
NBPNBP
Интересующийся

es
Offline Offline

« Ответ #5 : 10-07-2012 21:05 » new

Спасибо! Тоесть, если я правильно понял
  
typedef struct S{
                               int x;
                               int y;
                          }STR, *PSTR;

равносильно коду

struct STR{
                   int x;
                   int y;
                 }
typedef  S   STR, *PSTR;
« Последнее редактирование: 11-07-2012 03:52 от RXL » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 11-07-2012 03:52 » 

Либо ты в примере спутал S и STR, либо что-то не так понимаешь.

Для лучшей читаемости код нужно оборачивать тегом [code].
« Последнее редактирование: 11-07-2012 03:53 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 11-07-2012 06:45 » 

NBPNBP, и в конце объявления структуры обязательна точка с запятой - либо сразу после фигурной скобки, если нет объявления переменных, либо после них.

Цитата: RXL
Немного не в тему: как для неименнованной структуры задать конструктор?
А зачем? Конструктор по умолчанию есть всегда.
« Последнее редактирование: 11-07-2012 06:48 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 11-07-2012 06:53 » 

Плюс, структура изначально не обязана быть именованной, псевдонимы и для неименованной можно создавать.

Немного не в тему: как для неименнованной структуры задать конструктор?
Хороший, кстати, вопрос Улыбаюсь Никак, надо думать - это же сишное наследие, пришлось оставить для совместимости.
Записан
NBPNBP
Интересующийся

es
Offline Offline

« Ответ #9 : 12-07-2012 13:13 » 

Да, извините, ошибся, должно быть так:
 
typedef struct S{
                               int x;
                               int y;
                          }STR, *PSTR;

равносильно коду

struct S{
                   int x;
                   int y;
                 };
typedef  S   STR, *PSTR;
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines