匿名命名空间优于静态?

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


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

在命名空间范围内声明对象时,不推荐使用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 unnamed-namespace

此外,请注意,在声明名称空间范围内的对象时(根据标准),不推荐使用static关键字。


C ++标准读入7.3.1.1节未命名的命名空间,第2节:

在声明名称空间作用域中的对象时,不推荐使用static关键字,unnamed名称空间提供了一种更好的选择。

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


有一个有趣的问题与此有关:

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

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

但是现在你面临一个问题:这些函数对于模块不再是static的,因为static实际上并不是指模块,而是指源文件(转换单元)。 你被迫使它们是非static以允许它们从该模块的其他部分(目标文件)进行访问。 但这也意味着它们不再是模块的隐藏/私有的:有外部链接,可以从其他模块访问它们,这不是你的初衷。

namespace命名namespace也不能解决这个问题,因为它也是为特定的源文件(翻译单元)定义的,并且不能从外部访问。

如果可以指定某些namespaceprivate ,也就是说,无论在其中定义了什么,它都将被它所属的模块在内部使用。 但是,当然C ++没有像“模块”这样的概念,只有“翻译单元”,它们紧密地绑定到源文件。

链接地址: http://www.djcxy.com/p/73051.html

上一篇: Superiority of unnamed namespace over static?

下一篇: What is external linkage and internal linkage?