C ++ #include只加载一个命名空间?

时间:2015-05-18 13:54:19

标签: c++ xcode namespaces

可能是一个愚蠢的问题,但由于某些原因我不能让它工作。我对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的顺序,可以看到“游戏”命名空间,但不能看到“图形”命名空间。似乎它一次只能看到一个。我在这里误解了什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

您在两个标头中使用相同的包含警戒。理想情况下,include guard应该反映模块或标题的名称,但至少应该更改其中一个,以使它们都是唯一的。

答案 1 :(得分:2)

两个标头都使用相同的包含警卫:Airport_game_hpp。这意味着要包含的第二个标题将被忽略,因为它的保护已经由第一个标题定义。

graphics.hpp的守卫更改为Airport_graphics_hpp,一般情况下,请确保您的警卫名称是唯一的。