C ++头文件重定义错误

时间:2014-04-04 19:12:36

标签: c++ opengl header-files

我在openGl中创建了一个游戏,我遇到了一个问题,这个问题现在让我困扰了近2个小时。 主要功能在readobj.cpp中,其中包括World.h,我有一个使用Ball.h和Stick.h的World.h文件。另一方面,有一个Game.h文件,Ball.h和Stick.h都在使用它。

World.h

#include "Ball.h"
#include "Camera.h"
#include "Stick.h"
class World
{
Ball ball[15];
Ball qBall;
Camera camera;
public:
World();
void update();
void render();
};

Stick.h

#include "Game.h"
class Stick
{
point power;
public:
void setPosition(point);
void setPower(point);
void render();
void update();
};

Ball.h

#include "Game.h"
class Camera
{
public:
Camera();
void update();
void render();
};

Game.h

class point {
public:
double x,y,z;
};

我得到的错误是

g++ -Wall -c readobj.cpp -L. -lBall -lWorld -lCamera -lStick
In file included from Camera.h:1:0, from World.h:2,         from readobj.cpp:12:
Game.h:1:7: error: redefinition of ‘class point’
Game.h:1:7: error: previous definition of ‘class point’
In file included from Stick.h:1:0,
                 from World.h:3,
                 from readobj.cpp:12:
Game.h:1:7: error: redefinition of ‘class point’
Game.h:1:7: error: previous definition of ‘class point’

2 个答案:

答案 0 :(得分:4)

使用包含警卫!

示例性:

World.h:

#ifndef WORLD_H     // <<<<<<<<< Note these preprocessor conditions
#define  WORLD_H
#include "Ball.h"
#include "Camera.h"
#include "Stick.h"
class World
{
    Ball ball[15];
    Ball qBall;
    Camera camera;
public:
    World();
    void update();
    void render();
};
#endif // WORLD_H

<强>解释
如果头文件包含在其他头文件中,并且这些头文件在编译单元中冗余发生,则会出现这些'重新定义' / '重新声明'错误。
如上所示的所谓include guard条件会阻止预处理器多次呈现包含的代码,从而导致此类错误。

答案 1 :(得分:1)

您似乎无法保护您的标头不会被多次包含。

对于每个标题,请执行以下操作: 例如,对于game.h

#ifndef GAME_H
#define GAME_H
/*put your code here*/
#endif

或者另一种方式可能是从每个标题开始,这不在标准中,但大多数编译器都支持它。

#pragma once

告诉编译器只包含一次标题。

基本上,当您包含标头时,预处理器会将标头中的代码放入.cpp文件中。因此,如果这种情况发生不止一次,您最终会得到相同类别的多个声明等。