Pokimon
> а для Си никакой форвард декларейшн не нужен.
А тут:
struct A { struct B {}; struct B *b; // Что это, Берримор? }; struct B {};
cNoNim
Это ж из дизассемблтрованного текста, показывает наверное, что в структуре someStruct после 16 байтов прописана переменная структурного типа, в которой есть поле по смещению 28.
graveman
> Это ж из дизассемблтрованного текста, показывает наверное, что в структуре
> someStruct после 16 байтов прописана переменная структурного типа, в которой
> есть поле по смещению 28.
Дизассемблированного, наверное, в дебаге. Вот и всё объяснение.
O! 5 страниц уже! Однако!
Для топик стартера:
В С++ существуют конкретные инструменты для решения конкретных задач. Для решения твоей надо использовать
forward declaration. То что покимон предложил называется elaborated type specifier и используется обычно чтобы отличать
имена типов от имен объектов, функций в случае их совпадения.
struct A {}; int A(struct A*); // переопределяем A как функцию void f( ) { struct A* a; //указатель на структуру A( a); //вызов функции struct A ab; //объект типа A }}
В качестве дополнительной аргументации, могу предложить заинтересованным лицам
с помощью elaborated type specifier попытаться задекларировать шаблонный тип.
Zefick
> Что это, Берримор?
это какой то левый код... покимон такого не писал :)
struct A { struct B *b; // Что это, Берримор? }; struct B {};
здесь так то нету форвар декларашион.
нет именно потому что struct B может быть объявлен и в нутри struct A... а с форвард деклорашион такого не прокатит
eagle
а что твои слова значат если мы говорим о Си? без Си++?
eagle
Я пишу утилиту. Там есть три структуры, одна хранит вертексы, другая-фейсы, третья - вертекс юзер(описывает пользователя вертексов, т.е., фейсы, которые используют вершины). Каждый фейс имеет три члена структур типа вертекс юзер. В самой структуре вертекс юзер мне надо прописать указатель на фейс, ее содержащий.
typedef struct VertexUser_s { VertexUser_s *next, *prev; struct Face_s* pFace;// фейс, который ее использует }VertexUser; // typedef struct Face_s { Face_s *next, *prev; Vertex_s* Vertexs[3]; //вершины объекта VertexUser VertexUsers[3];//фейс - это пользователь трех вершин }Face;
Как то я пробовал объявлять структуры так struct A; это прокатывало только с классами(class A;)
Поэтому, и начал тему, так как не хочется делать через void*.
Также этот вопрос возникал при разработке игрового меню(там у меня правят пока void*).
cNoNim
> а что твои слова значат если мы говорим о Си? без Си++?
Без понятия, Си не увлекаюсь.
graveman
struct Face; struct Vertex; struct VertexUser { VertexUser *next, *prev; Face* pFace;// фейс, который ее использует }; struct Face { Face *next, *prev; Vertex* Vertexs[3]; //вершины объекта VertexUser VertexUsers[3];//фейс - это пользователь трех вершин };
eagle
спасибо
Тема в архиве.