Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > вопрос по typedef struct |
Автор: leniviy 16.3.2009, 15:07 | ||
Привет. Есть не моя структура и существующий код, в котором объявляются указатели на неё с ключевым словом struct. Можно ли задекларировать новый тип - синоним существующего, чтобы работал в .c и .cpp и переменные этого типа можно было объявлять с модификатором struct?
Похоже, что при объявлении нового типа он не помечается как "структура" |
Автор: math64 16.3.2009, 15:17 | ||
В объявлении typedef struct AAA BBB; BBB объявляется как тип, а не структура. В C имена структур и типов находятся в разных пространствах имён, ключевое слово struct обязательно, в C++ struct можно опускать, но использование struct перед именем типа запрещено в обоих языках. Можно написать
|
Автор: leniviy 16.3.2009, 15:42 |
да. Я уже в своё время намучился с макросом EOF. |
Автор: Dem_max 16.3.2009, 16:30 | ||
|
Автор: mes 16.3.2009, 16:37 |
Dem_max, какое отношение имеет приведенный код к сабжу ? |
Автор: Dem_max 16.3.2009, 16:40 |
mes, чел хотел переопределение названия структуры |
Автор: Dem_max 16.3.2009, 19:23 |
mes, тогда struct THEAD stgr; или THEAD stgr; |
Автор: mes 16.3.2009, 20:53 | ||||
если структура заранее объявлена, как struct Т; то не получится Т тайпдефить к другой структуре. т.е не допустима такая последовательность :
именно обход этой проблемы и ищет тс, а причину описал math64:
![]() |
Автор: Dem_max 16.3.2009, 21:06 |
mes, Я взял книжку 1990 года про СИ и привел пример, там от С++ и речи не вели. |
Автор: ParaPik 8.4.2009, 20:54 | ||
Вообще, ключевое слово struct также используется для того, чтобы избежать неоднозначности. Т.е. существует два случая испоьзования struct: 1. Объявление структуры. 2. Решение неоднозначности. Например:
|
Автор: zim22 8.4.2009, 21:03 | ||
какая такая неоднозначность? если слово struct убрать - оно вообще не скомпилится ![]()
|
Автор: J0ker 8.4.2009, 22:50 |
в C++ типы "T" и "struct T" эквивалентны - в отличии от plain C |
Автор: mes 8.4.2009, 22:55 | ||
как раз о том и речь, без указания struct в приведенном примере возникает неоднозначность и как следствие невозможность компиляции. ![]() |
Автор: ParaPik 9.4.2009, 16:33 |
Дело в том, что C++, в отличии от других языков программирования, таких как C# и Java, позволяет объявлять переменную с тем же именем, что и название, в данном случае, структуры, но с другим типом(char, int, double и так далее). И чтобы указать компилятору, что вы имеете в виду именно тип структуру, то надо перед именем структуры поставить ключевое слово struct(это же относится и к ключевому слову class). А то, с чего началась данная тема, вообще зависит от реализации компилятора. Так что, некоторые старые компиляторы, а вполне возможно и новые, нормально воспримут код, написанный в начале темы. |
Автор: Любитель 9.4.2009, 16:40 | ||
К типу, объявленному через typedef невозможно обратиться через ключевое слово struct. Ни в С, ни в С++. Что впрочем уже было сказано давно в этой теме. Так что следующее утверждение ложно:
|
Автор: zim22 9.4.2009, 16:41 | ||||||
покажите пожалуйста на примере. первый раз слышу о такой возможности с++ я пытался и так:
и так:
но компилятор ругается error C2371: 'dp' : redefinition; different basic types |
Автор: leniviy 9.4.2009, 17:06 | ||||
Сомнительная польза. По-моему, единственное полезное применение struct - объявить указатель на ещё не объявленную структуру. Например, так:
|
Автор: math64 10.4.2009, 07:29 | ||
leniviy, твой код будет компилироваться только в C. объявив struct BBB внутри struct AAA, ты объявляешь struct AAA::ВВB. Правильно будет:
|
Автор: mes 10.4.2009, 13:20 | ||||||||
имхо, имелось ввиду это:
|
Автор: UnrealMan 10.4.2009, 17:22 | ||
Скорее, что-то вроде этого:
|