23

我想声明将在项目中的各个类中使用的字符串常量。我正在考虑两种选择

选项1:

#header file 
class constants{
    static const string const1;
};

#cpp file

const string constants::const1="blah";

选项 2:

#header file 
namespace constants{
    static const string const1="blah";
};

只是想知道什么是更好的实现。

已经看过了

在 C++ 中存储类特定命名常量的位置

在 C++ 中将常量字符串放在哪里:静态类成员或匿名命名空间


更新:

选项 3:

根据“potatoswatter”和“sellibitze”的建议,我目前有以下实现?

#header file
namespace constants{
    extern const string& const1(); //WORKS WITHOUT THE EXTERN  ***WHY***
};

#cpp file
namespace constants{
   const string& const1(){static string* str = new string ("blah"); return *str;}
}

我在需要使用常量的地方包含了头文件。这个实现有什么主要的缺点吗?

4

4 回答 4

12

2年后更新:

由多个源文件访问的每个全局变量都应该包装在一个inline函数中,以便链接器在文件之间共享对象,并且程序会正确初始化它。

inline std::string const &const1() {
    static std::string ret = "hello, world!";
    return ret;
}

inline函数是隐式extern的,如果您愿意,可以将其包装在命名空间或类中。(但不要只使用类来保存静态成员,因为命名空间更适合。并且不要使用匿名命名空间,因为这会破坏链接器,并且每个源都会看到不同的std::string对象。)

于 2010-09-08T16:54:29.880 回答
11

所有的答案都会std::string冒着为字符串文字动态分配内存的风险,该字符串文字将在程序(和二进制文件)的整个生命周期中保持不变,因此应该避免使用它们。

sellibitze的答案很接近,但它存在声明一次然后在其他地方定义它的问题,我觉得这并不优雅,而且需要更多工作。最好的方法是

namespace constants {
    const char * const blah = "blah!"
    const char * const yada = "yada yada!"
}

这是解决方案在这里进一步讨论。

于 2013-07-29T15:46:15.563 回答
9

两者都不。我会这样做:

// header file
namespace constants {
extern const char const1[];
}

// cpp file
namespace constants {
extern const char const1[] = "blah";
}

头文件包含const1类型不完整但可转换为的声明, char const*cpp 文件包含具有外部链接的字符数组的定义。没有像使用std::string. 所以,这是一个加号,恕我直言。

于 2010-09-08T20:14:44.440 回答
4

选项 1 实现了与选项 2 相同的效果,但方式更加混乱。

如果您要使用只有静态成员的类,尤其是对于全局访问/常量,请使用命名空间。

于 2010-09-08T16:51:43.453 回答