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

Тема в разделе "WASM.BEGINNERS", создана пользователем ckunep, 26 мар 2011.

  1. ckunep

    ckunep New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2008
    Сообщения:
    19
    Здравствуйте, мне не удается скомпилировать проект в Visual C 2010. В нем содержатся следующие файлы:

    Код (Text):
    1. //  Main.cpp
    2.  
    3. #include "../hpp/Main.hpp"
    4.  
    5. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, int)
    6. {
    7.   ...
    8. }
    Код (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
    Код (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
    Код (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
    Код (Text):
    1. //  Splash.cpp
    2.  
    3. #include "../hpp/Splash.hpp"
    4.  
    5. ...
    Во время компиляции выдается ошибка:
    Код (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

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    В том что определять символ в заголовочном файле это плохо(ужасно). Нужно убрать содержимое HFGE.hpp в один из .cpp. А в HFGE.hpp написать:
    Код (Text):
    1. namespace HFGE
    2. {
    3.   extern const TCHAR *splashTitle;
    4. }
     
  3. ckunep

    ckunep New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2008
    Сообщения:
    19
    Спасибо за подсказку. У меня ещё вопрос возник... А как лучше константы добавлять в пространство имен? Ну, например, через классы, макросы или же как я сделал?
     
  4. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    1. Макросы не ограничены пространствами имен. Константы, определенные таким образом, будут видны всюду, где определен соответствующий макрос.
    2. Константы, локальные для класса, естественно, имеет смысл определять внутри этого класса.
    3. Остальные константы имеет смысл определять как "extern const..."
     
  5. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    или же если речь про vs через __declspec(selectany)