Редактирую гавно-код. Вместо того, чтобы сделать вот так: Код (Text): typedef struct _BLABLASTRUCT { //.... } BLABLASTRUCT, *PBLABLASTRUCT, **PPBLABLASTRUCT; BLABLASTRUCT Bla; Программист делал вот так: struct { // ... }; Что заставило его так сделать я не знаю. Т.к. данная структура встречается очень часто, где-то около 1000 раз. И вот мне понадобилось объявить указатель на подобную структуру. Как сделать указатель на стуктуру, которая находится внутри другой структуры и объявлена просто struct { // ... } ??
Сделай указатель на первый мембер этой безымянной структуры. Код не обязательно говно только лишь потому, что в нем есть безымянные вложенные структуры
В коде должно быть место, где такие структуры используются. Посмотри как сделано там. Не стал же бы программист просто объявлять такие структуры и нигде их не использовать.
Простой пример, где такое есть, прямо из WinNT.h: Код (Text): typedef union _LARGE_INTEGER { struct { DWORD LowPart; LONG HighPart; } DUMMYSTRUCTNAME; struct { DWORD LowPart; LONG HighPart; } u; #endif //MIDL_PASS LONGLONG QuadPart; } LARGE_INTEGER; DUMMYSTRUCTNAME - это дефайн без значения.
Magnum В C++0х это можно было бы сделать через auto / decltype. В прерыдущих версиях, включая плоский си - никак. Начать хотя бы с того, что безымянные структуры запрещены в C++ (насчет си не уверен). Ну а локальные типы не видны вне выражения. Безымянную структуру скорее всего можно отнести к такому типу. Я про что-то вроде Код (Text): class foo { ... }; typedef std::shared_ptr<class foo> foo_ptr; // В данном случае foo будет взят не внешний, а свой собственный, локальный, видимый в пределах выражения.
Кстати, попутно задам вопрос. В чем преимущество или правильность объявления структурного типа Код (Text): typedef struct _MyStructType { ... } MyStructType; или Код (Text): typedef struct { ... } MyStructType; по сравнению с Код (Text): struct MyStructType { ... }; ? Еще с институтских времен сложилась привычка использовать именно последний вариант (фактически, аналогично использованию class, тем более что class и struct отличаются вроде бы только умолчанием относительно private и public). Причем использовал последний вариант даже вроде бы просто в чистом C (тогда еще борландский TurboC), и ни компилятор, ни преподы не ругались.
Dmitry_Milk Тут всё просто. Если в C вы используете третий вариант, в коде придётся писать Код (Text): struct MyStructType first_struct; struct MyStructType *some_func(struct MyStructType *ps); и т.д. Чтобы опустить использование ключевого слова struct, применяют typedef. Чтобы еще больше сократить количество печатаемых символов, объявление структуры и использование typedef совмещают, хотя можно было сделать так: Код (Text): struct _MyStructType { ... }; typedef struct _MyStructType MyStructType; Следующие строки попарно эквивалентны, если используется первый вариант: Код (Text): struct _MyStructType first_struct; MyStructType first_struct; struct _MyStructType *some_func(struct _MyStructType *ps); MyStructType *some_func(MyStructType *ps) Использование второго варианта исключает возможность использовать определения переменных с помощью ключевого слова struct, т.е. первую и третью строки в вышеприведенном участке кода. Есть, кстати, четвёртый вариант: Код (Text): struct { ... } my_struct; Тут объявление и определение объединены; такую конструкцию удобно использовать, чтобы соблюсти порядок локальных переменных. Код (Text): struct { uint32_t data_offset; uint32_t data_size; uint32_t next_record; } file_record; uint32_t next_record = first_record; while (next_record) { fseek(f, next_record, SEEK_SET); fread(f, &file_record, sizeof(file_record); next_record = file_record.next_record; // ... } Но, конечно, если требуется многократное использование такой структуры, следует объявить её другим вариантом.
Обьявит гдето такуюже точно структуру но с именем и юзать указатель ее типа - кастыль Аднако, но рабочий.
Dmitry_Milk В структуре - адрес на свой собственный тип (связный список). Код (Text): typedef struct _TLinkListNode { BYTE m_Data [124]; struct _TLinkListNode* m_pNext; } TLinkListNode;