我有一个包含以下定义的头文件
const std::string error[] = {"a", "b"};
现在我将这个文件包含在两个不同的翻译单元中并编译源代码。一切正常,但为什么呢?预计会中断one definition rule
。
现在更有趣的是,我正在改变类型
const char* error[] = {"a", "b"};
这里是预期的错误
multiple definition of `error'
它与int
,char
,short
和其他整数类型的std :: string的工作方式相同。这是什么?
答案 0 :(得分:11)
const
为命名空间范围的变量提供内部链接,这就是它工作的原因,与
static const std::string error[] = {"a", "b"};
第二个不起作用,因为它不是const变量,而是由char
组成的变量。
答案 1 :(得分:2)
声明为const
的全局变量具有内部链接,就好像它们也被声明为static
一样。您可以在不同的转换单元中定义具有相同名称的内部变量,这样您的第一个示例中会发生这种情况 - 包含标题的每个单元都会获得自己的数组副本。
第二个例子不是const
- 指针指向常量对象,但它们本身是可变的。因此,此数组具有外部链接,并受一个定义规则的约束。
答案 2 :(得分:0)
来自MSDN
在C中,常量值默认为外部链接,因此它们只能出现在源文件中。在C ++中,常量值默认为内部链接,这允许它们出现在头文件中。