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

12 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
}
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*fer 17

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

你需要声明xconst char *const A,它创建一个指向常量(块)char的常量指针.