c – 命名空间中的静态变量和非静态变量 - 代码日志

c – 命名空间中的静态变量和非静态变量

我有一个名称空间foo,其中包含一个整型条,声明为…

foo.h中:

namespace foo {
    int bar;
}

现在如果我只在一个文件中包含foo.h,这样做很好。但是当我从两个或更多文件中包含foo.h时会出现问题:我收到链接器错误。我想出如果我声明吧是静态的,我可以在多个文件中包含foo.h。这对我来说似乎很奇怪,因为我不知道可以在命名空间内声明一个静态变量。 (那有什么意思?)

为什么这个工作?更重要的是,为什么它不工作没有静态?静态在命名空间中使用什么意思?

在不同的上下文中有静态的多重含义。在这个特定的上下文中,这意味着变量具有内部链接,因此,包含该标题的每个翻译单元将具有该变量的自己的副本。

请注意,虽然这将沉默链接器错误,它将为生成的每个对象文件维护一个单独的foo :: bar变量(更改不会在不同的对象文件中看到)。

如果你想要一个变量,你应该将它声明为extern在标题中,并提供一个单一的定义在一个翻译单位。

http://stackoverflow.com/questions/11623451/static-vs-non-static-variables-in-namespace

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 命名空间中的静态变量和非静态变量