Naw*_*waz 120

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

在声明命名空间作用域中的对象时,不推荐使用static关键字; unnamed-namespace提供了一个更好的选择.

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

以下代码在C++中有效

   //legal code
   static int sample_function() { /* function body */ }
   static int sample_variable;
Run Code Online (Sandbox Code Playgroud)

但是这段代码无效:

   //illegal code
   static class sample_class { /* class body */ };
   static struct sample_struct { /* struct body */ };
Run Code Online (Sandbox Code Playgroud)

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

   //legal code
   namespace 
   {  
        class sample_class { /* class body */ };
        struct sample_struct { /* struct body */ };
   }
Run Code Online (Sandbox Code Playgroud)

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

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

  • 你正在回答自己的问题并对自己表示感谢:-o (34认同)
  • 更一般地,未命名的命名空间允许外部链接.这就是启用本地到翻译单元类声明的原因.它还允许例如外部链接字符串常量,用作模板参数. (11认同)
  • 正如Fred Nurk在另一个答案中所指出的那样,似乎这个"已弃用"的评论已从最新的C++ 0x FCD(n3225)中删除. (10认同)
  • 仅仅在cpp中定义类(没有匿名命名空间,没有静态)会有什么不同? (10认同)
  • @LuchianGrigore在案例2中链接问题`.cpp`正在定义一个具有相同名称的类. (5认同)
  • @curiousguy:即使是标准也不再认为.C++ 11已经删除了弃用! (3认同)
  • @curiousguy:正如我在同一行写的那样,你可能忽略了:"*......按照标准*". (2认同)

Sas*_*asQ 6

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

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

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

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

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

如果可以指定某些namespaceprivate(即,在其中定义的任何内容)意味着它所属的模块在内部使用,那将是很好的.但是,当然C++没有"模块"这样的概念,只有"翻译单元",它们与源文件紧密相连.

  • 无论如何,这将是一个hack和一个有限的解决方案,但您可以将带有内部静态或命名空间函数的cpp文件包含到"main"cpp文件中.然后从构建中排除这些'satellite'cpp文件,你就完成了.唯一的问题,如果你有两个或更多'主'cpp文件,他们都想使用其中一个'卫星'cpp文件的酷函数... (3认同)

Sal*_*gar 5

C++标准在第7.3.1.1节"未命名的命名空间"中进行了介绍,第2段:

在声明命名空间作用域中的对象时,不推荐使用static关键字,unnamed-namespace提供了一个更好的替代方法.

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

  • 不,它没有.草案做了.在此之后不久又有一份草案恢复了这一愚蠢的变化. (3认同)