3

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

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

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

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

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

这就是预期的错误

multiple definition of `error'

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

4

3 回答 3

12

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

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

第二个不起作用,因为它不是 const 的变量,而是char它包含的 s 。

于 2013-11-25T14:37:56.410 回答
2

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

第二个例子不是const- 指针指向常量对象,但它们本身是可变的。所以这个数组有外部链接,并且服从一个定义规则。

于 2013-11-25T14:41:10.880 回答
0

来自MSDN

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

于 2013-11-25T14:42:10.597 回答