【发布时间】:2014-09-30 01:13:56
【问题描述】:
大多数时候我看到常量 C 字符串定义为:
static char const* MY_CONSTANT = "Hello World";
但是,指针本身不是const。像下面这样做不是更合适吗?
static char const* const MY_CONSTANT = "Hello World";
我认为有 2 个具有像这样的常量全局变量的目标:
- 不允许修改字符串
- 不允许变量指向其他任何东西
我只是假设在定义常量字符串时需要这两个目标。
另一件有趣的事是我被允许这样做:
int main()
{
auto MY_CONSTANT = "";
MY_CONSTANT = "Another String";
}
这告诉我auto 将字符串推断为char const* 而不是char const* const。
所以我有两个主要问题:
- 定义常量 c 样式字符串的最合适方法是什么(我想常量指针指向某物,是更普遍的问题吗?)。为什么选择其中之一?
- 关于我的
auto示例,它选择char const*是有道理的(因为它是恒定的数据数组,而不是指针本身)。我可以将auto推导出为char const* const还是我可以更改代码以使其产生这种类型?
【问题讨论】:
-
你不是说
const char* const吗? -
@Adam 这两种形式都是有效的 C++。你的和我的一样。
-
auto检测到的默认值是最小限制,这意味着不能重新分配变量的事实只是您的选择。你可以做auto const我想,如果你愿意,但最好不要把它强加给每个人。 -
字符串文字可以绑定到
const char *;您是否希望字符串变量保持不变取决于您。您问的问题与should I use const int i=0 or int i=0相同 -
你没有提到的另一个品种是
char const s[] = "Hello, World!";。 (在 C++ 中,关键字static是多余的,因为命名空间范围consts 默认为静态,但无论如何使用它是很实用的,以防有人将您的标头移植到 C 并且没有意识到这一点)。
标签: c++ c++11 constants auto cstring