Пространство имен C ++ в отдельном файле, используемом другими - PullRequest
0 голосов
/ 28 марта 2012

Я постоянно нахожу, что часто хочу иметь набор «глобальных» параметров для программы - переменные, используемые многими различными классами в разных файлах, скомпилированных отдельно.Я хотел бы сохранить эти параметры вместе, краткими и легкодоступными, что-то вроде

namespace Params {
    static int WindowHeight = 600;
    //...etc.
};

Однако, если это включено, чтобы сделать ao и bo, «static» делает эти переменные локальными для каждого файла .o, ачем их совместное использование и «статическое» угробление приводит к нескольким определениям.Другой вариант - создать статический класс, такой как

class Params {
  public:
    static int WindowHeight;
    //...etc.
}

Но тогда вам придется инициализировать параметры отдельно в других местах:

int Params :: WindowHeight = 600;

и это то, чего я действительно хотел бы избежать.Я даже приму что-то вроде следующего (кстати, у меня это не сработало)

namespace Params {
    static int WindowHeight
#ifdef __MUST_INIT_PARAMS
    = 600
#endif
    ;
};

, если каждая запись может храниться в одном месте.

Любойидеи?Любая помощь будет отличной!Спасибо!

Ответы [ 5 ]

1 голос
/ 28 марта 2012

Если все ваши параметры являются целыми числами, известными во время компиляции, вы можете использовать enum:

namespace Params {
  enum e {
    WindowHeight = 600,
    // etc.
  };
}

Использование:

  InitWindow(Params::WindowHeight);
0 голосов
/ 28 марта 2012

Как отмечено выше, вам нужно использовать extern, а не static. Если вы хотите, чтобы объявление и определение были в одном и том же файле, ваша последняя попытка с определением будет работать, если вы используете extern:

namespace Params {
    extern int WindowHeight
#ifdef __MUST_INIT_PARAMS
    = 600
#endif
    ;
};
0 голосов
/ 28 марта 2012

Ваше первое использование static объявляет переменную, специфичную для каждой единицы перевода, которая включает заголовок. Внутри класса static означает совершенно новую вещь - она ​​объявляет переменную в классе.

Чтобы определить глобалы внутри пространства имен, вам необходимо использовать extern:

//header.h
namespace Params {
    extern int WindowHeight;
};

//definition.cpp
namespace Params
{
    int WindowHeight = 600;
}
0 голосов
/ 28 марта 2012

Вам нужно сделать это:

//Params.h

namespace Params {
    extern int WindowHeight;  //it is declaration
};

, а затем в .cpp файле:

//Params.cpp

 #include "Params.h" //not needed!

namespace Params {
    int WindowHeight = 600;  //it is definition
};
0 голосов
/ 28 марта 2012

вам нужно использовать extern вместо static.
Определите его один раз в файле cpp.

// Filename.h

namespace Params 
{
    extern int WindowHeight;
};

Определить его Один из файлов cpp
// Filename.cpp

namespace Params 
{
    int WindowHeight = 100;
};
...