3

从以下stackoverflow 答案中,用户说:

这意味着该变量对于翻译单元是本地的(简单地说,对于单个源文件),并且不能从其外部访问。这种使用 static 实际上在当前的 C++ 标准中已被弃用 - 相反,您应该使用匿名命名空间:

static int x = 0;

应该:

namespace {
    int x = 0;    
}

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

4

1 回答 1

2

不,它目前没有被弃用。这是在某一时刻,但由于 C 的可比性问题而被逆转。在 1999 年之前的某个时候,它已被弃用,这导致了缺陷报告 174,其中说:

应该撤销弃用全局静态的决定。

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

这导致了缺陷报告 223,其中弃用的含义从以下内容进行了修改:

deprecated 被定义为:标准当前版本的规范,但不保证在未来的修订中成为标准的一部分。

值得注意的是,这意味着未来的标准将仅支持未弃用的功能:

然而,这个定义似乎表明任何未弃用的特性“保证在未来的修订中成为标准的一部分”。尚不清楚该暗示是否有意,因此可能需要修改此定义。

并将deprecated的含义更改为:

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

后来由于缺陷报告 1012的 C 兼容性问题,该功能未被弃用:

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

于 2015-12-07T18:32:00.763 回答