可能是一个愚蠢的问题,但由于某些原因我不能让它工作。我对C ++很陌生,所以我想我可能会在某处产生一些误解。
graphics.hpp:
#ifndef Airport_game_hpp
#define Airport_game_hpp
#include <SDL2/SDL.h>
namespace graphics {
namespace gl{
static SDL_Window *mainWindow;
static SDL_GLContext mainContext;
bool initGL();
bool destroyGL();
}
}
#endif
game.hpp:
#ifndef Airport_game_hpp
#define Airport_game_hpp
namespace game{
void render();
}
#endif
main.cpp中:
#include <iostream>
#include "graphics/graphics.hpp"
#include "game/game.hpp"
int main(int argc, char* argv[])
{
std::cout << "Starting application \n";
if (!graphics::gl::initGL()){
std::cout << "OpenGL initialization failed \n";
return false;
}
//Test
game::render(); //This line says: Use of undeclared identifier "game"
graphics::gl::destroyGL();
std::cout << "Exit successful \n";
}
如果我在main.cpp上交换#include-s的顺序,可以看到“游戏”命名空间,但不能看到“图形”命名空间。似乎它一次只能看到一个。我在这里误解了什么?
谢谢!
答案 0 :(得分:3)
您在两个标头中使用相同的包含警戒。理想情况下,include guard应该反映模块或标题的名称,但至少应该更改其中一个,以使它们都是唯一的。
答案 1 :(得分:2)
两个标头都使用相同的包含警卫:Airport_game_hpp
。这意味着要包含的第二个标题将被忽略,因为它的保护已经由第一个标题定义。
将graphics.hpp
的守卫更改为Airport_graphics_hpp
,一般情况下,请确保您的警卫名称是唯一的。