2012-07-20 90 views
0

在我目前的工作中,我看到在cpp文件中的未命名命名空间中声明的变量,并且只会被该类使用,就好像它们是成员变量一样。在未命名的命名空间中声明变量

我把它看作是一种有趣的方法,它只保存.h中的接口信息和.cpp中的接口信息,并且比通常的pimpl习惯用法的工作更少。

我看到人们一直在使用pimpl,但从来没有这种方法,是否有任何问题呢?

+4

'皮条客'成语是'钱==权力'之一吗? – Aesthete 2012-07-20 08:43:37

+0

在旧的C中,你不得不标记全局变量和函数'static'来使它们保持本地文件而不被导出。在C++中,您可以使用匿名命名空间来获得相同的效果。 – 2012-07-20 08:45:40

+1

你能举一个你的意思吗?您不能在名称空间范围声明成员,只能在类中声明它们。如果它们是在命名空间范围(未命名)声明的,那么它们不是成员。 – 2012-07-20 08:45:55

回答

0

在.cpp文件的未命名名称空间中声明的变量是文件作用域;这意味着每次执行程序只有一个实例。

您可以通过创建对象的两个实例并观察它们干扰未命名名称空间中的对方变量来亲自看到这一点。

+0

只有在.cpp文件的未命名名称空间中声明的'static'变量是文件作用域。否则,他们可能会有外部链接,并可以从其他文件访问 – Andrew 2012-07-20 09:11:20

+0

对于像没有做额外工作一样的pimpl,这么多。 – Lap 2012-07-20 09:19:51

+0

@匿名命名空间中的@ande非'static'变量可能具有外部链接,但无法从其他翻译单元访问它们:请参阅http://stackoverflow.com/questions/4181059/linkage-of-symbols-within -an-namespace-within-a-regular-namespace – ecatmur 2012-07-20 09:26:37

0

请显示一些示例代码。 AFAIK,你不能在未命名的命名空间中声明成员变量(除非这个类本身是在未命名的命名空间中声明的)。

引入了未命名的名称空间,以取代常用的将变量声明为静态的做法,仅在一个编译单元中使用。

+0

我的不好,那些变量不再是成员变量,而是只用于那个类,就好像它们是成员变量一样。 – Lap 2012-07-20 09:16:47

+0

它们不能用作成员变量,因为每个类只有一个实例。但是,它们可以像使用静态成员变量一样使用 – 2012-07-20 09:34:15