对头文件的困惑

时间:2014-01-18 21:24:32

标签: c++ visual-studio-2012 sdl header-files

我是一个相当新的程序员,我正在使用Visual Studio / C ++ / SDL制作一个小型游戏项目。所以我的代码布局如下:

prototypes.h:

#ifndef PROTOTYPES_H
#define PROTOTYPES_H

#include "constants.h"
#include "globals.h"
#include "functions.h"

struct circle
{
    float x;
    float y;
    int r;
};
//other class declarations
#endif PROTOTYPES_H

functions.h:

#ifndef FUNCTIONS_H
#define FUNCTIONS_H

#include "SDL_header.h"
#include "prototypes.h"

bool check_collision(circle circle, SDL_Rect rect);
//other function declarations

#endif FUNCTIONS_H

至于根据this的解释,到目前为止,我所知道的是完全正确的。 即使我将鼠标移到IDE中的functions.h文件中的'circle',我也会弹出正确的工具提示'struct circle'。但是当我编译时,我在引用functions.h ...

时得到错误'未声明的标识符'圈'' 怎么了??

1 个答案:

答案 0 :(得分:1)

您目前有一个循环包含。 Prototype.h包含functions.h,functions.h包含prototype.h

现在如果你正在编译调用一个CPP文件prototype.h第一第二行包括functions.h的内容,这将使实际定义之前圆结构的引用。

在您的情况下,如果functions.h包括关于prototype.h定义的结构功能不应该有任何理由为包含从prototype.h functions.h。 如果您管理头文件之间的依赖关系,您的代码将更容易管理..

在你的情况下:

  • function.h取决于prototype.h,必须包含它
  • prototype.h不得包含function.h

此外,通常值得将类/结构及其所有函数保存在单个头文件中。除非文件变得太大,否则你可以将它分成多个标题。

注:蛮力解决方案可以只是其functions.h使用前添加一个正向减速结构圈子,但是我会只为他们真的无法避免的情况下保留这样的解决方案