在确保翻译单元之间的可用性时是否静态弃用?

时间:2015-12-07 17:44:33

标签: c++ static global-variables unnamed-namespace translation-unit

来自以下stackoverflow answer,用户说:

  

这意味着变量是翻译单元的本地变量(简单地说,   到单个源文件),并且无法从外部访问它。这个   事实上,在当前的C ++标准中,不推荐使用静态 -   相反,你应该使用匿名命名空间:

static int x = 0;
     

应该是:

namespace {
    int x = 0;    
}

我不同意匿名命名空间是首选方法,
但是现在使用静态真的已经弃用了吗? 标准在哪里说这个?

1 个答案:

答案 0 :(得分:2)

不,目前尚未弃用。在某一时刻,由于C的可比性问题,这种情况发生了逆转。在1999年之前的某个时候它被弃用了,这导致defect report 174说:

  

应该颠倒弃用全局静态的决定。

     
      
  • 我们不能弃用静态,因为它是C的重要组成部分,放弃它会使C ++不必要地与C不兼容。
  •   
  • 因为模板可以在未命名的命名空间的成员上实例化,所以某些编译系统可能会将这些符号放在   全局链接器空间,可能会给它带来很大的负担   连接。没有静态,程序员没有机制可以避免   负担。
  •   

这导致defect report 223修改了弃用的含义:

  

不推荐使用定义为:标准的当前版本的规范性,但未来版本中不保证是标准的一部分。

有人指出,这意味着,在未来的标准中,只有非弃用的功能才会得到支持:

  

但是,这个定义似乎表明任何未弃用的功能都将在未来的版本中保证成为标准的一部分。"目前还不清楚这意味着什么,所以这个定义可能需要修改。

并将不赞成的含义更改为:

  

这些是已弃用的功能,其中不推荐使用的定义为:标准的当前版本的规范性,但已被确定为从未来版本中删除的候选者。

以后,由于defect report 1012的C兼容性问题,该功能未被撤销:

  

尽管7.3.1.1 [namespace.unnamed]声明不推荐使用static关键字来声明命名空间作用域中的变量,因为未命名的命名空间提供了一个更好的替代方案,因此不可能在任何时候删除该功能。可预见的未来,特别是考虑到C兼容性问题。委员会应考虑取消弃用。