命名空间范围内的const变量是否隐式静态?

时间:2010-03-04 16:04:13

标签: c++

我知道命名空间范围内的static const int x = 42;等同于const int x = 42;,因为const变量是隐含的static(必须将它们声明为extern才能被赋予外部连锁)。包含此声明的每个翻译单元都会获得x的本地副本。

这仅适用于某些(可能是整数?)类型吗?我在头文件中有以下代码:

namespace XXX {
    static const char* A = "A";
    static const char* B = "B";
    static const char* C = "C"; // and so on
}

(请告诉我为什么我不应该使用C风格的字符串的评论 - 这是遗留代码)

此标头包含在多个源文件中,并且一切正常(每个编译单元都有自己的这些char*的副本)。我原以为我可以从这些中移除static,因为它是多余的,但是当我这样做时,我得到关于已经在另一个对象中定义的符号的链接错误。我在这里错过了什么?这些const char*不是是否隐式静态?

1 个答案:

答案 0 :(得分:17)

在您的示例中,您正在创建指向常量(块)char的指针,而不是创建指向char的常量指针。因此,您的指针不是常量,因此不是隐式静态的。

您需要将x声明为const char *const A,这会创建一个指向常量(块)char的常量指针。