我有一系列与消息ID对应的常量字符串;我正在尝试为这些常量创建一个集中的位置,因为它们在我的应用程序中的各个类中使用。我原本打算创建一个包含它们的命名空间:
// MessageIDs.hh
namespace MessageIDs {
const std::string kMessage1("Message1");
...
}
然后我开始阅读内部/外部链接定义,现在我有几个问题。
1)唯一的缺点是不能使常量extern因为它们将具有内部链接而不能将它们用作模板参数吗?
2)我不知道的方法还有其他任何缺点吗?
答案 0 :(得分:2)
1)我看到这种方法的一个明显优势:你总能在正确的位置看到定义常量的值。即如果将常量定义为extern,则必须将定义与初始化器一起放在一个cpp文件中,并将头部保留为extern const而不使用值,这会误导支持者。
您提到的缺点(无法将它们用作模板参数)实际上是次要的,您是否经常需要std :: string模板参数?我没有看到那些谢天谢地。
2)也许另一个小问题是你在每个翻译单元中都有重复的std :: string对象,包括头文件,人们可以认为它是一个缺点。
在字符串常量的这种特殊情况下,看起来const char *是全案例最佳解决方案。