агрегат «arcball arcball» имеет неполный тип и не может быть определен

У меня возникла небольшая проблема со следующими файлами:

у меня есть структура arcball в этом файле:

#ifndef ARCBALL_H_
#define ARCBALL_H_

#include "ex1.h"
...

extern struct arcball{
float radius;
int x,y;
}arcball;

...

#endif /* ARCBALL_H_ */

и у меня есть следующий файл ex1.h, который включает в себя файл arcball.h:

#ifndef __EX1_H__
#define __EX1_H__////////////////////////////
// Project Includes
////////////////////////////

#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include "arcball.h"

////////////////////////////
// OpenMesh Includes
////////////////////////////

#include "OpenMesh/Core/IO/MeshIO.hh"#include "OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh"
////////////////////////////
// GL Includes
////////////////////////////

#include "GLee.h"#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

...

struct arcball arcball;
#endif

Я должен включить заголовок ex1.h, поскольку ex1.h содержит включает в себя функции перенасыщения I
используйте также в файле arcball.cpp.
и я должен использовать заголовок arcball.h, чтобы использовать функции и структуру
определяет в этом файле.

Я получаю следующую ошибку:

In file included from arcball.h:11:0,
from arcball.cpp:8:
ex1.h:120:16: error: aggregate ‘arcball arcball’ has incomplete type and cannot be defined
make: *** [ex1] Error 1

Я не понимаю, почему это неполный тип, так как я включил файл arcball.h

Это проблема взаимного включения или проблема определения структуры / использования?
И как это можно решить?

Спасибо!

0

Решение

Два .h файлы включают друг друга, вызывая большую путаницу. Это ужасно плохая идея, так как #ifdef Окружение будет иметь разные эффекты в зависимости от того, какой файл включается первым: в этом случае arcball.h -> ex1.h -> arcball.h-но-действительно-ничего-из-за-#-ifdef.

Кроме того, это также плохая идея объявить переменную без extern в заголовке (здесь ex1.h). Это, вероятно, не имеет эффекта, который вы хотите. Переменные без extern должен быть объявлен только в .c файлы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]