0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 9
|
|||||||||||
1 | |||||||||||
Typedef участвующий в создании класса22.10.2016, 15:02. Показов 2035. Ответов 18
Метки нет (Все метки)
нашел вот такой фрагмент кода в релизных исходниках одного известного сайта
0
|
22.10.2016, 15:02 | |
Ответы с готовыми решениями:
18
Объект не участвующий в рендеринге, но участвующий в столкновениях Typedef внутри класса Изменить поле класса используя typedef Указатель на шаблон класса через typedef |
7789 / 6556 / 2984
Регистрация: 14.04.2014
Сообщений: 28,661
|
|
22.10.2016, 15:26 | 2 |
Первое - древний синтаксис языка C, а второе - по-современному.
1
|
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 9
|
|
22.10.2016, 15:42 [ТС] | 3 |
nmcf, спасибо...
Мне не пришлось столкнуться с чистым c, так что я не знал. Спасибою
0
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,057
|
||||||
22.10.2016, 17:59 | 4 | |||||
Сообщение было отмечено DrOffset как решение
Решение
Ничего "древнего" тут нет. Оба синтаксиса являются одинаково древними и одинаково современными. Оба синтаксиса корректны и в С, и в С++, однако ведут себя по-разному.
* В первом случае и на территории С кода, и на территории С++ кода будет создан тип по имени ms3d_keyframe_pos_t .* Во втором случае на территории С кода будет создан тип по имени строго struct ms3d_keyframe_pos_t , а не территории С++ кода его можно будет называть как struct ms3d_keyframe_pos_t так и просто ms3d_keyframe_pos_t .По этой причине в чисто С++ программе первый вариант не имеет смысла - он ничего не дает, а только удлиняет определение типа. В чисто С программе первый вариант имеет смысл, но лучше было бы заодно таки дать структуре и тэг
ms3d_keyframe_pos_t . Однако и в этом случае я бы дал структуре тэг, как показано в моем варианте.
1
|
7789 / 6556 / 2984
Регистрация: 14.04.2014
Сообщений: 28,661
|
|
22.10.2016, 18:55 | 5 |
TheCalligrapher, ну как нет? Дописывание struct во всех ссылках на тип было именно в древние времена, а typedef позволял не писать struct. В C++ typedef применительно к struct не имеет смысла, только для создания псевдонимов.
0
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,057
|
|
22.10.2016, 19:33 | 6 |
Не понимаю, о чем речь. Какие еще "древние времена"???
Дописывание struct во всех ссылках на struct-тип - классическое фундаментальное свойство языка С. Оно всегда было в С и всегда будет в С. Ничего в этом отношении в С никогда не менялось и ничего "древнего" в этом нет. Современный С ничем не отличается в этом отношении от оригинального С.Если вам не нравится везде дописывать struct в С, вы можете использовать typedef для создания более короткого псевдонима для struct-типа. Опять же так было в С всегда и в современном С никаких изменений тут не произошло.При этом в С коде это чисто вопрос стиля: кто-то любит всегда безусловно создавать более короткие псевдонимы для всех struct-типов (см. мой пример), а кто-то считает, что этого делать не стоит, а надо везде явно писать struct при ссылке struct-тип. Никто не связывает последний вариант ни с какой "древностью", а объясняет его просто нежеланием скрывать struct-овую природу типа за typedef-именем.Так что ни с точки зрения синтаксиса языка, ни с точки зрения стилистических соображений ничего "древнего" тут нет и в помине. Откуда вы это взяли - мне не ясно. Если и искать тут какой-то водораздел, то проходит он скорее по линии С vs. С++, а не по линии "древний" vs. "современный". Тут можно только добавить, еще раз, что использование безтагового типа в первом случае многие (включая меня) сочтут порочной практикой. Такое чаще всего встречается в коде у новичков. Даже при использовании typedef имеет смысл дать struct-типу таг, как показано в моем примере.
0
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
||||||
22.10.2016, 19:56 | 7 | |||||
werarray01,
И до кучи:
0
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
||||||
22.10.2016, 20:10 | 9 | |||||
Именно к typedef, никак . Ну разве что вот так, отношение налицо :
0
|
Croessmah
|
22.10.2016, 20:14
#10
|
0
|
Nosey
|
22.10.2016, 20:19
#11
|
0
|
Croessmah
|
22.10.2016, 20:21
#12
|
0
|
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
|
|
22.10.2016, 20:28 | 13 |
TheCalligrapher, а в чем смысл тэга у struct?
0
|
7789 / 6556 / 2984
Регистрация: 14.04.2014
Сообщений: 28,661
|
|
22.10.2016, 20:32 | 14 |
Не помню уже. Из какой-то статьи, где разъяснялось, что древний C компилятор как-то по особому группировал имена и их непосредственно нельзя было использовать - либо struct везде писать, либо делать typedef. Под древним я понимаю то, что не C++, а C. Совместимость я и не отрицал.
Добавлено через 3 минуты mishelle92, первое имя относится к struct, а второе - псевдоним, который назначается с помощью typedef. Нет никакого смысла, кроме совместимости с древним C.
0
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,057
|
|
22.10.2016, 20:52 | 15 |
Смысл тэга в том, что это основной/фундаментальный способ именования struct-типа в С. Все остальное - это уже псевдонимы.
Наличие тэга позволяет вам создавать типы, ссылающиеся сами на себя (например, при описании элемента списка), а также использовать forward-декларации struct-типов в ситуациях, когда полное объявление типа по какой-то причине недоступно (циклическая зависимость заголовочных файлов, например). Добавлено через 1 минуту То есть тема "древности" фактически вылилась в то, что С - "древний" язык, а С++ - "не древний" язык. Это, простите, белиберда. Никакой разницы в степени "древности" между этими языками нет.
1
|
7789 / 6556 / 2984
Регистрация: 14.04.2014
Сообщений: 28,661
|
|
22.10.2016, 20:55 | 16 |
TheCalligrapher, ну как нет? Сделали же проще. И с классами typedef не пишут. В C ещё и переменные надо было объявлять в начале, вроде бы. Ещё какие-то ограничения были.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
22.10.2016, 21:06 | 17 |
не считая того, что плюсы моложе своего папочки си.
огааа. и такой тайпдеф в плюсах никому три раза не упал. и нужен он исключительно для обратной совместимости со своим папочкой.
0
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,057
|
|
22.10.2016, 21:20 | 18 |
В оригинальном С переменные надо было объявлять в начале блока. В современном С - не надо. Если бы речь шла о требовании объявлять переменные в начале блока, то это требование можно было бы заслуженно назвать "древним"/"устаревшим". Но в данном случае ни о чем подобном речи не идет. Поэтому мне не ясно при чем здесь пример с переменными.
Ым... С и С++ - совершенно разные языки, отличающиеся в т.ч. на фундаментальном уровне. Отличий там великое множество. Эти языки существуют параллельно и никакой времннОй "упорядоченности"/"преемственности" (типа С "древний", а С++ - "новый") между С и С++ нет и никогда не было. Поэтому назвать современный синтаксис языка С "древним" только потому, что это С, никто, разумеется, не будет.
0
|
7789 / 6556 / 2984
Регистрация: 14.04.2014
Сообщений: 28,661
|
|
23.10.2016, 11:10 | 19 |
Но воспринимается это именно так. Сначала было так, а после по-другому.
0
|
23.10.2016, 11:10 | |
23.10.2016, 11:10 | |
Помогаю со студенческими работами здесь
19
Вызов пользовательского класса и ошибка E2108 Improper use of typedef 'PROG' Typedef void F(); typedef для типа функции через идентификатор Без использования typedef все работает. При добавлении typedef — более 100 ошибок Как при создании экземпляра класса инициализировать переменные вложенного класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |