c++ - 头文件中的变量未在范围内声明

标签 c++ scope sdl header-files

我正在尝试制作一个简单的游戏,我有我的主 .cpp 文件,其中包含一个头文件(我们称之为 A),其中包含所有其他头文件(我们称之为 B)。在其中一个 B 头文件中,我包含了 A 文件以访问其中定义的 programRunning bool 值。尽管包含定义变量的 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|错误:“programRunning”未在此范围内声明

最佳答案

问题是 pong_header.h 包括 pong_event.h 它声明 programRunning 之前,所以当 pong_header.h 尝试包含 pong_event.h,包含守卫会阻止它。解决方法是简单地将 bool programRunning 声明移动到 pong_event.h 的顶部。

现在,这将导致另一个问题 - 每个包含任何这些 header 的 .cpp 文件都将获得它们自己的 programRunning 拷贝,这将导致链接错误(programRunning 的多个定义),或者它编译,但不会按您期望的方式运行。

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

extern bool programRunning;

然后,在一个你的.cpp文件中(最好有int main),你实际声明它(即没有 extern):

bool programRunning;

关于c++ - 头文件中的变量未在范围内声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18233566/

相关文章:

javascript - 在 javascript 中使用 () 作为函数

c - Linux 头文件中的函数定义中的 DECLSPEC 和 SDLCALL 是什么意思?

c++ - 在消息发送线程中使用std::condition_variable等待,发生死锁

c++ - 用于生成行人检测 ROI 的图像调整大小与图像金字塔 - OpenCV

c++ - 类型错误 : unable to acces a wrapped function with double pointer argument

javascript - 限制递归函数for循环内的变量范围

c++ - 使用 %s 调用 printf 并传递一个零长度的 char* 是未定义的行为吗?

java - "provides"方法或注入(inject)类上的 Dagger 2 范围注释

c++ - SDL 库 PNG 支持

c - 调整窗口大小后 SDL2 无法正确渲染