类中的静态字符串常量与常量的命名空间[c ++]

时间:2010-09-08 16:49:02

标签: c++ namespaces constants string-constant

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

选项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";
};

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

已经看过了

  

Where to store Class Specific named constants in C++

     

Where to put constant strings in C++: static class members or anonymous namespaces


更新:

选项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 个答案:

答案 0 :(得分:11)

2年后更新:

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

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

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

答案 1 :(得分:7)

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

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

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

此解决方案将进一步讨论here

答案 2 :(得分:5)

都不是。我会选择这个:

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

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

头文件包含const1的声明,其类型不完整但可转换为char const*,而cpp-file包含具有外部链接的字符数组的定义。没有与std::string一样的动态初始化。所以,这是一个加号,恕我直言。

答案 3 :(得分:4)

选项1与选项2的实现方式相同,但方式更为混乱。

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