未命名的命名空间优于静态?

时间:2010-12-12 16:02:22

标签: c++ static namespaces static-variables static-functions

未命名的命名空间如何优于static关键字?

3 个答案:

答案 0 :(得分:115)

您基本上是指C ++标准中的$ 7.3.1.1 / 2部分,

<击>

<击>
<击>   

使用static关键字是   在声明对象时不推荐使用   名称范围;该   unnamed-namespace提供了一个优越的   替代。   

未命名的命名空间优于static关键字,主要是因为关键字static仅适用于变量声明和函数,而不适用于用户定义的类型

以下代码在C ++中有效

   //legal code
   static int sample_function() { /* function body */ }
   static int sample_variable;

但是这段代码无效:

   //illegal code
   static class sample_class { /* class body */ };
   static struct sample_struct { /* struct body */ };

所以解决方案是,unnamed-namespace,就是这个,

   //legal code
   namespace 
   {  
        class sample_class { /* class body */ };
        struct sample_struct { /* struct body */ };
   }

希望它解释为什么unnamed-namespace优于static

<击> 另请注意,在声明命名空间作用域中的对象时,不推荐使用static关键字(根据标准)。

答案 1 :(得分:6)

C ++标准中的第7.3.1.1节“未命名的命名空间”第2节:

  

使用static关键字是   在声明对象时不推荐使用   命名空间范围,未命名的命名空间   提供了一个更好的选择。

静态仅适用于对象,函数和匿名联合的名称,而不适用于类型声明。

答案 2 :(得分:6)

这是一个与此相关的有趣问题:

假设您使用static关键字或未命名的namespace在模块(翻译单元)内部创建一些函数,因为此函数旨在由模块内部使用,并且无法在其外部访问。 (未命名的namespace除了函数之外,还具有内部数据和类型定义的优势。

随着时间的推移,模​​块实现的源文件变得越来越大,并且您希望将其拆分为几个单独的源文件,这样可以更好地组织代码,更快地找到定义并独立编译。

但是现在你遇到了一个问题:这些函数不再是static模块,因为static实际上并没有引用模块,但是到源文件(翻译单位)。您不得不将它们设为非static,以允许从该模块的其他部分(目标文件)访问它们。但这也意味着它们不再隐藏/私有模块:具有外部链接,可以从其他模块访问它们,这是你的初衷。

未命名namespace也无法解决此问题,因为它也是针对特定源文件(翻译单元)定义的,无法从外部访问。

如果可以指定某些namespaceprivate,也就是说,在其中定义的任何内容,意味着它所属的模块在内部使用,那将是很好的。但是,当然C ++并没有像#34; modules&#34;这样的概念,只有&#34;翻译单元&#34;,它们与源文件紧密相连。