global std :: string和一个定义规则

时间:2013-11-25 14:36:30

标签: c++ one-definition-rule

我有一个包含以下定义的头文件

const std::string error[] = {"a", "b"};

现在我将这个文件包含在两个不同的翻译单元中并编译源代码。一切正常,但为什么呢?预计会中断one definition rule

现在更有趣的是,我正在改变类型

const char* error[] = {"a", "b"};

这里是预期的错误

multiple definition of `error'

它与intcharshort和其他整数类型的std :: string的工作方式相同。这是什么?

3 个答案:

答案 0 :(得分:11)

const命名空间范围的变量提供内部链接,这就是它工作的原因,与

有效相同
static const std::string error[] = {"a", "b"};

第二个不起作用,因为它不是const变量,而是由char组成的变量。

答案 1 :(得分:2)

声明为const的全局变量具有内部链接,就好像它们也被声明为static一样。您可以在不同的转换单元中定义具有相同名称的内部变量,这样您的第一个示例中会发生这种情况 - 包含标题的每个单元都会获得自己的数组副本。

第二个例子不是const - 指针指向常量对象,但它们本身是可变的。因此,此数组具有外部链接,并受一个定义规则的约束。

答案 2 :(得分:0)

来自MSDN

  

在C中,常量值默认为外部链接,因此它们只能出现在源文件中。在C ++中,常量值默认为内部链接,这允许它们出现在头文件中。