我知道命名空间范围内的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*
的不是是否隐式静态?
答案 0 :(得分:17)
在您的示例中,您正在创建指向常量(块)char的指针,而不是创建指向char的常量指针。因此,您的指针不是常量,因此不是隐式静态的。
您需要将x
声明为const char *const A
,这会创建一个指向常量(块)char的常量指针。