Asi*_*med 18 c++ namespaces constants string-constant
我想声明将在项目中的各个类中使用的字符串常量.我正在考虑两种选择
选项1:
#header file
class constants{
static const string const1;
};
#cpp file
const string constants::const1="blah";
Run Code Online (Sandbox Code Playgroud)
选项2:
#header file
namespace constants{
static const string const1="blah";
};
Run Code Online (Sandbox Code Playgroud)
只是想知道什么是更好的实现.
已经看过了
更新:
选项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;}
}
Run Code Online (Sandbox Code Playgroud)
我包含头文件,我需要使用常量.这种实施有什么主要缺点吗?
Pot*_*ter 11
2年后更新:
每个可由多个源文件访问的全局应该包含在一个inline函数中,以便链接器在文件之间共享对象,程序会正确初始化它.
inline std::string const &const1() {
static std::string ret = "hello, world!";
return ret;
}
Run Code Online (Sandbox Code Playgroud)
该inline函数是隐式的extern,如果您愿意,可以包装在命名的命名空间或类中.(但是不要只使用一个类来保存静态成员,因为名称空间更好.并且不要使用匿名命名空间,因为这会破坏链接器,并且每个源都会看到不同的std::string对象.)
所有的答案都std::string冒着为字符串文字动态分配内存的风险,这个字符串文字将在程序(和二进制文件)的整个生命周期内保持不变,因此应该避免它们.
sellibitze的答案很接近,但它有一次声明它然后在其他地方定义它的问题,我觉得这不是优雅的,而是更多的工作.最好的方法是
namespace constants {
const char * const blah = "blah!"
const char * const yada = "yada yada!"
}
Run Code Online (Sandbox Code Playgroud)
这是解决方案,这里进一步讨论.
都不是.我会选择这个:
// header file
namespace constants {
extern const char const1[];
}
// cpp file
namespace constants {
extern const char const1[] = "blah";
}
Run Code Online (Sandbox Code Playgroud)
头文件包含const1不完整类型但可转换为的声明,char const*并且cpp-file包含具有外部链接的字符数组的定义.没有像你一样的动态初始化std::string.所以,这是一个加号,恕我直言.
| 归档时间: |
|
| 查看次数: |
25864 次 |
| 最近记录: |