Здравствуйте, мне не удается скомпилировать проект в Visual C 2010. В нем содержатся следующие файлы: Код (Text): // Main.cpp #include "../hpp/Main.hpp" int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, int) { ... } Код (Text): // Main.hpp #ifndef __Main_hpp_ #define __Main_hpp_ ... #include "HFGE.hpp" ... #endif Код (Text): // HFGE.hpp #ifndef __HFGE_hpp_ #define __HFGE_hpp_ ... namespace HFGE { ... const TCHAR *splashTitle = "Launching..."; } #endif Код (Text): // Splash.hpp #ifndef __Splash_h_ #define __Splash_h_ ... #include "HFGE.hpp" ... #endif Код (Text): // Splash.cpp #include "../hpp/Splash.hpp" ... Во время компиляции выдается ошибка: Код (Text): 1>Splash.obj : error LNK2005: "char const * const HFGE::splashTitle" (?splashTitle@HFGE@@3PBDB) уже определен в Main.obj 1>E:\VisualC\MyFirstGame\Debug\MyFirstGame.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более Если же убрать переменную splashTitle из пространства имен, то компиляция завершается успешно. Кто-нибудь знает в чём проблема?
В том что определять символ в заголовочном файле это плохо(ужасно). Нужно убрать содержимое HFGE.hpp в один из .cpp. А в HFGE.hpp написать: Код (Text): namespace HFGE { extern const TCHAR *splashTitle; }
Спасибо за подсказку. У меня ещё вопрос возник... А как лучше константы добавлять в пространство имен? Ну, например, через классы, макросы или же как я сделал?
1. Макросы не ограничены пространствами имен. Константы, определенные таким образом, будут видны всюду, где определен соответствующий макрос. 2. Константы, локальные для класса, естественно, имеет смысл определять внутри этого класса. 3. Остальные константы имеет смысл определять как "extern const..."