为什么全局const char需要"static"关键字,而布尔型变量不需要?

16

共享标题。

我可以这样做:

const bool kActivatePlayground=false;

在多个文件中包含时有效。

我无法这样做:

const char * kActivePlayground = "kiddiePool";

会导致错误:重复符号。

但这个可以:

static const char * kActivePlayground = "kiddiePool";

为什么const char *需要static,而const bool不需要?此外,我认为由于const始终是隐式的static,因此static是不必要的,那么这里需要吗?


static 使一个符号对该TU私有。从错误信息来看,您是否确保在任何其他文件中没有重新定义 const char *? - Koushik Shetty
这是变量名称的唯一定义。 - johnbakers
再次强调:const本身就是隐式的static,因此使用static这个词甚至不必要,就像对于bool一样。 - johnbakers
kActivePlayground 不是 const。因此它不是静态的。它是一个指向 const 的指针。static 关键字将其定义为静态。请这样声明和初始化它:char * const kActivePlayground = "whatever" - Koushik Shetty
我可以直接解决const的问题,但我仍在标准中寻找为什么你的char *需要static的原因。在C++11 §7.1.1p7中,“命名空间作用域中声明的名称如果没有存储类说明符,则具有外部链接性,除非它由于先前的声明而具有内部链接性,并且不是声明为const。 声明为const且未明确声明为extern的对象具有内部链接性。”我知道这并没有回答你关于char *的问题,但我还在继续寻找。这是一个有趣的问题。 - WhozCraig
1
@Koushik说得对,应该把评论转成答案。这是一个新手的错误。指针本身没有被设置为“const”,因此是一个重复的符号。const修改的是指针所指向的内容,但并不修改实际变量,也就是指针本身。 - johnbakers
2个回答

33
在C++中,const变量默认具有静态链接,而非const变量具有外部链接。

多重定义错误的原因是:

const char * kActivePlayground = "kiddiePool";

创建一个具有外部链接的变量。

等一下,我不是刚说过const变量默认具有静态链接吗?没错。但kActivePlayground不是const。它是一个指向const char的非const指针。

这将按您的预期工作:

const char * const kActivePlayground = "kiddiePool";

谢谢,Ben。我也错过了它,一直在想它为什么不符合内部链接的条件(反复看了3.5遍,自言自语“怎么回事”)。很好的答案。 - WhozCraig
3
因此,我会针对英语使用者主张(反对)“const”应始终位于其所修饰内容的右侧,“const char”可能会让您感到疑惑,但“char const”则不会。 - Matthieu M.

0

你可以使用一个常量字符数组

const char kActivePlayground[] = "kiddiePool";

而且kActivePlayground也可以用于赋值,因为它是一个引用

const char* playground_text = kActivePlayground;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接