У меня возникла небольшая проблема со следующими файлами:
у меня есть структура 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
Это проблема взаимного включения или проблема определения структуры / использования?
И как это можно решить?
Спасибо!
Два .h
файлы включают друг друга, вызывая большую путаницу. Это ужасно плохая идея, так как #ifdef
Окружение будет иметь разные эффекты в зависимости от того, какой файл включается первым: в этом случае arcball.h -> ex1.h -> arcball.h-но-действительно-ничего-из-за-#-ifdef.
Кроме того, это также плохая идея объявить переменную без extern
в заголовке (здесь ex1.h). Это, вероятно, не имеет эффекта, который вы хотите. Переменные без extern
должен быть объявлен только в .c
файлы.
Других решений пока нет …