全局std::字符串和一个定义规则



我有一个头文件,其中包含以下定义

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

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

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

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

这就是预期错误

multiple definition of `error'

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

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

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

第二个不起作用,因为它不是常量变量,而是它所包含的char

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

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

来自MSDN

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

相关内容

  • 没有找到相关文章

最新更新