C ++定义跨文件常量的最佳方法

时间:2009-03-13 03:45:28

标签: c++ templates const constants extern

我正在开发一款游戏并且有一个有趣的问题。我有一些游戏范围的常量值,我想在一个文件中实现。现在我有这样的事情:

constants.cpp

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

constants.hpp

extern const int BEGINNING_HEALTH;
extern const int BEGINNING_MANA;

然后文件#include“constants.hpp” 这很有效,直到我需要使用其中一个常量作为模板参数,因为外部链接的常量不是有效的模板参数。 所以我的问题是,实现这些常量的最佳方法是什么?我担心简单地将常量放在头文件中会导致在每个翻译单元中定义它们。而且我不想使用宏。

由于

8 个答案:

答案 0 :(得分:19)

摆脱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

答案 1 :(得分:10)

枚举怎么样?

constants.hpp

  enum {
    BEGINNING_HEALTH = 10,
    BEGINNING_MANA = 5
  }

答案 2 :(得分:6)

在你的.hpp文件中使用“static const int”,并且什么都不放在.cpp文件中(除了你当中的其他任何代码)。

答案 3 :(得分:3)

使用命名空间:

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

然后你可以用作player.health = GameBeginning :: HEALTH;

答案 4 :(得分:0)

大多数编译器根本不为const POD值分配空间。他们优化出来并将它们视为#define d,不是吗?

答案 5 :(得分:0)

简单的事情发生了什么:

#define BEGINNING_HEALTH 10

男人,那些日子 哦等等,那些仍然是的日子!

答案 6 :(得分:-2)

也许是静态类的东西?

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

答案 7 :(得分:-5)

作为标题问题的快速解答,单例模式是一种可能的最佳C ++方式,用于定义跨文件常量并仅确保对象的一个​​实例。

就模板参数问题而言,您需要传递类型而不是值。你的类型是“int”。