Проблема с пространством имен

Discussion in 'WASM.BEGINNERS' started by ckunep, Mar 26, 2011.

  1. ckunep

    ckunep New Member

    Blog Posts:
    0
    Здравствуйте, мне не удается скомпилировать проект в Visual C 2010. В нем содержатся следующие файлы:

    Code (Text):
    1. //  Main.cpp
    2.  
    3. #include "../hpp/Main.hpp"
    4.  
    5. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, int)
    6. {
    7.   ...
    8. }
    Code (Text):
    1. //  Main.hpp
    2.  
    3. #ifndef __Main_hpp_
    4. #define __Main_hpp_
    5.  
    6. ...
    7.  
    8. #include "HFGE.hpp"
    9.  
    10. ...
    11.  
    12. #endif
    Code (Text):
    1. //  HFGE.hpp
    2.  
    3. #ifndef __HFGE_hpp_
    4. #define __HFGE_hpp_
    5.  
    6. ...
    7.  
    8. namespace HFGE
    9. {
    10.   ...
    11.   const TCHAR *splashTitle = "Launching...";
    12. }
    13.  
    14. #endif
    Code (Text):
    1. //  Splash.hpp
    2.  
    3. #ifndef __Splash_h_
    4. #define __Splash_h_
    5.  
    6. ...
    7.  
    8. #include "HFGE.hpp"
    9.  
    10. ...
    11.  
    12. #endif
    Code (Text):
    1. //  Splash.cpp
    2.  
    3. #include "../hpp/Splash.hpp"
    4.  
    5. ...
    Во время компиляции выдается ошибка:
    Code (Text):
    1. 1>Splash.obj : error LNK2005: "char const * const HFGE::splashTitle" (?splashTitle@HFGE@@3PBDB) уже определен в Main.obj
    2. 1>E:\VisualC\MyFirstGame\Debug\MyFirstGame.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более
    Если же убрать переменную splashTitle из пространства имен, то компиляция завершается успешно. Кто-нибудь знает в чём проблема?
     
  2. Booster

    Booster New Member

    Blog Posts:
    0
    В том что определять символ в заголовочном файле это плохо(ужасно). Нужно убрать содержимое HFGE.hpp в один из .cpp. А в HFGE.hpp написать:
    Code (Text):
    1. namespace HFGE
    2. {
    3.   extern const TCHAR *splashTitle;
    4. }
     
  3. ckunep

    ckunep New Member

    Blog Posts:
    0
    Спасибо за подсказку. У меня ещё вопрос возник... А как лучше константы добавлять в пространство имен? Ну, например, через классы, макросы или же как я сделал?
     
  4. Ursus

    Ursus Member

    Blog Posts:
    0
    1. Макросы не ограничены пространствами имен. Константы, определенные таким образом, будут видны всюду, где определен соответствующий макрос.
    2. Константы, локальные для класса, естественно, имеет смысл определять внутри этого класса.
    3. Остальные константы имеет смысл определять как "extern const..."
     
  5. Velheart

    Velheart New Member

    Blog Posts:
    0
    или же если речь про vs через __declspec(selectany)