C++ лучший способ определить межфайловые константы

StackOverflow https://stackoverflow.com/questions/641397

Вопрос

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

константы.cpp

extern const int BEGINNING_HEALTH = 10;
extern const int BEGINNING_MANA = 5;

константы.hpp

extern const int BEGINNING_HEALTH;
extern const int BEGINNING_MANA;

А затем файлы просто #include "constants.hpp" Это работало отлично, пока мне не нужно было использовать одну из констант в качестве параметра шаблона, потому что константы, связанные с внешне, не являются действительными параметрами шаблона.Итак, мой вопрос: как лучше всего реализовать эти константы?Я боюсь, что простое размещение констант в заголовочном файле приведет к тому, что они будут определены в каждой единице перевода.И я не хочу использовать макросы.

Спасибо

Это было полезно?

Решение

Избавьтесь от extern и все готово.

Этот код прекрасно работает в заголовке, потому что все «действительно постоянно» и, следовательно, имеет внутреннюю связь:

const int BEGINNING_HEALTH = 10;
const int BEGINNING_MANA = 5;
const char BEGINNING_NAME[] = "Fred";
const char *const BEGINNING_NAME2 = "Barney";

Этот код нельзя безопасно поместить в файл заголовка, поскольку каждая строка имеет внешнюю связь (либо явно, либо из-за того, что она не является действительно постоянной):

extern const int BEGINNING_HEALTH = 10;
extern const int BEGINNING_MANA = 5;
const char *BEGINNING_NAME = "Wilma";  // the characters are const, but the pointer isn't

Другие советы

Как насчет перечислений?

константы.hpp

  enum {
    BEGINNING_HEALTH = 10,
    BEGINNING_MANA = 5
  }

Используйте «static const int» в своем файле .hpp и ничего не помещайте в файл .cpp (за исключением, конечно, любого другого кода, который у вас там есть).

используйте пространства имен:

namespace GameBeginning {
    const int HEALTH = 10;
    const int MANA   = 5; 
};

тогда вы можете использовать как player.health = GameBeginning::HEALTH;

Большинство компиляторов просто не выделяют место для константных значений POD.Они оптимизируют их и относятся к ним так, как если бы они были #defineд, не так ли?

Что случилось с простым:

#define BEGINNING_HEALTH 10

Блин, это были дни.
Ой, подождите, эти все еще есть в дни!

возможно, что-то вроде статического класса?

class CONSTANTS {
public:
static inline int getMana() { return 10;};
};

В качестве быстрого ответа на главный вопрос: шаблон Singleton — возможно, лучший способ C++ определить межфайловые константы и гарантировать только один экземпляр объекта.

Что касается проблемы с параметром шаблона, вам нужно передать тип, а не значение.Ваш тип — «int».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top