2012-11-17 68 views
0

我有以下文件有點問題:骨料「軌跡球軌跡球具有不完整的類型,不能被定義

我對這個文件軌跡球結構:

#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文件

這是一個相互包容問題或結構定義/用法問題? 如何解決?

謝謝!

+1

我不認爲聲明一個與其類型名稱相同的變量是一個非常好的主意。此外,如果這是C++而不是C,請不要將它標記爲C. – 2012-11-17 17:57:19

+0

它是一個全局變量,它不是typedef,所以使用arcball將簡單地調用arcball變量......在這裏沒有明確的C++用法,這可以像ac代碼一樣使用和編譯。 – Itzik984

+1

好,但請注意,只有一個C或C++標記應該存在 - 它們不是相同的語言,甚至不可互換。 – 2012-11-17 18:00:27

回答

1

這兩個.h文件相互包含,造成了很多混淆。這是一個非常糟糕的主意,因爲周圍的#ifdef將根據首先包含哪個文件而產生不同的效果:在這種情況下,arcball.h - > ex1.h - > arcball.h - 但實際上沒有什麼因爲 - the-的#ifdef。

此外,在頭文件(這裏是ex1.h)中聲明一個沒有extern的變量也是一個壞主意。這可能沒有你想要的效果。不應使用extern的變量只能在.c文件中聲明。