头文件中的变量未在范围中声明

时间:2013-08-14 13:48:12

标签: c++ scope sdl header-files

好的,我知道之前可能已经提到了类似的一些问题,但我在互联网上的任何地方都找不到任何关于此问题的内容所以我只能假设它是因为我对C ++并不是那么好而且我已经完成了没有意识到的错误。

在我正在制作的游戏中,我有我的主.cpp文件,其中包含一个头文件(我们称之为A),其中包含所有其他头文件(让我们称之为B)。在其中一个B头文件中,我包含了一个A文件来访问其中定义的programRunning布尔值。尽管包含定义变量的A文件,B头文件中的任何一个似乎都无法使用它。我真的很困惑,非常感谢一些帮助。以下是我使用的代码:

pong_header.h(如上所述的A头文件)

#ifndef PONG_HEADER_H
#define PONG_HEADER_H

#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include <stdio.h>

#include "pong_graphics.h"
#include "pong_core.h"
#include "pong_entity.h"
#include "pong_event.h"

bool programRunning;

#endif

pong_event.h(其中一个B头文件)

#ifndef PONG_EVENT_H
#define PONG_EVENT_H

#include "pong_header.h"


void Pong_handleEvents(SDL_Event event)
{
    while(SDL_PollEvent(&event))
    {
        switch(event.type)
        {
        case SDL_QUIT:
            programRunning = true;
            break;
        case SDL_KEYDOWN:
            switch(event.key.keysym.sym):
            case SDLK_ESCAPE:
                programRunning = false;
                break;
            break;

        default:
            break;
        }
        Pong_handleEntityEvents(event)
    }
}

其他B文件以相同方式访问programRunning

确切的错误Code :: Blocks给我如下 Pong\pong_event.h|20|error: 'programRunning' was not declared in this scope

1 个答案:

答案 0 :(得分:6)

问题是pong_header.h包含pong_event.h 之前它声明programRunning,所以当pong_event.h尝试包含pong_event.h时,包括警卫阻止它。修复方法是将bool programRunning声明移至pong_event.h的顶部。

现在,这将导致另一个问题 - 包含任何这些标头的每个.cpp文件都会获得自己的programRunning副本,这会导致链接错误({{的多个定义1}}),或者它编译,但不会以你期望的方式运行。

您要做的是将其声明为 extern ,即

programRunning

然后,在一个extern bool programRunning; 个文件中(最好是以.cpp为准),你实际上是声明它(即没有 {{1 }}):

int main