Здравствуйте, мне не удается скомпилировать проект в Visual C 2010. В нем содержатся следующие файлы: Code (Text): // Main.cpp #include "../hpp/Main.hpp" int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, int) { ... } Code (Text): // Main.hpp #ifndef __Main_hpp_ #define __Main_hpp_ ... #include "HFGE.hpp" ... #endif Code (Text): // HFGE.hpp #ifndef __HFGE_hpp_ #define __HFGE_hpp_ ... namespace HFGE { ... const TCHAR *splashTitle = "Launching..."; } #endif Code (Text): // Splash.hpp #ifndef __Splash_h_ #define __Splash_h_ ... #include "HFGE.hpp" ... #endif Code (Text): // Splash.cpp #include "../hpp/Splash.hpp" ... Во время компиляции выдается ошибка: Code (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 написать: Code (Text): namespace HFGE { extern const TCHAR *splashTitle; }
Спасибо за подсказку. У меня ещё вопрос возник... А как лучше константы добавлять в пространство имен? Ну, например, через классы, макросы или же как я сделал?
1. Макросы не ограничены пространствами имен. Константы, определенные таким образом, будут видны всюду, где определен соответствующий макрос. 2. Константы, локальные для класса, естественно, имеет смысл определять внутри этого класса. 3. Остальные константы имеет смысл определять как "extern const..."