[英]Correct way to define a constant C-string in C++?
大多数时候我看到常量C字符串定义为:
static char const* MY_CONSTANT = "Hello World";
但是, 指针本身不是const
。 像下面这样做是不是更合适?
static char const* const MY_CONSTANT = "Hello World";
我认为有两个像这样的常量全局变量的目标:
我只是假设在定义常量字符串时需要这两个目标。
另一个有趣的事情是我被允许这样做:
int main()
{
auto MY_CONSTANT = "";
MY_CONSTANT = "Another String";
}
这告诉我auto
将字符串推断为char const*
而不是char const* const
。
所以我有两个主要问题:
auto
例子,为什么它选择char const*
是有道理的(因为它是恒定的数据数组,而不是指针本身)。 我可以auto
推导为char const* const
还是可以更改代码使其成为这样的类型? 好吧,如果它真的是一个常数,那么constexpr将是C ++ 11的方法:
constexpr char const* MY_CONSTANT = "Hello World";
第一个例子:
static char const* MY_CONSTANT = "Hello World";
只是说我有一个指向具有静态存储持续时间的char const的指针,如果它在函数之外会使它成为全局。
如果我们要求指针也是const,那么我们需要你介绍的第二种形式。 这一切都取决于指针是否确实应该是const。 在大多数情况下,你看到没有顶级const的代码的原因是因为他们只是忘了把它放入,因为它们并不意味着指针也是const。
例如, static是否需要const成员是每个实例还是每个类:
class A
{
char const* const const_per_instance = "Other Const String";
public:
constexpr static char const* const const_per_class = "Hello World" ;
};
如果我们要求const是每个类,那么我们需要使用静态,否则不需要。 如果您不允许使用constexpr ,示例会略有变化:
class A
{
char const* const const_per_instance = "Other Const String";
public:
static char const* const const_per_class ;
};
char const* const A::const_per_class = "Hello World" ;
但实质是相同的只是语法不同。
对于你的第二个问题,因为Gotw#92表示自动降低顶级const,给出的一个例子如下:
const int ci = val;
auto g = ci;
它说:
g的类型是int。
请记住,仅仅因为ci是const(只读)与我们是否希望g为const无关。 这是一个单独的变量。 如果我们想要g为const,我们就像上面的情况c那样说过const auto
正在提到的例子如下:
int val = 0;
//..
const auto c = val;
constexpr auto& MY_CONSTANT = "Hello World";
const char (&)[12]
constexpr
,MY_CONSTANT具有内部链接,可以在标题中使用 这是一种罕见的情况,你碰巧覆盖指向const值的指针,因此大多数开发人员省略了第二个const,但在语义上它确实是这样的:
static char const* const MY_CONSTANT = "Hello World";
或以这种形式:
static const char* const MY_CONSTANT = "Hello World";
如果它是另一个constexpr函数的一部分,则需要constexpr用于声明:
static constexpr const char* const MY_CONSTANT = "Hello World";
static constexpr const char* Foo()
{
// ...
return MY_CONSTANT;
}
做得好,注意指针部分的常量! 很多人都没有意识到这一点。
为了防止字符串文字被每个翻译单元复制(或使优化器的字符串池部分更容易),我建议将实际数据放在某个源文件中。 如果更改文本,这也将节省一些重新编译。
标题:
extern const char *const mystring;
资源:
extern const char *const mystring = "hello";
另外
标题:
extern const std::string mystring;
资源:
extern std::string mystring = "hello";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.