在确保翻译单元之间的可用性时,不赞成使用静态

Is static deprecated when ensuring availability between translation units?

本文关键字:不赞成 静态 可用性 翻译 确保 单元 之间      更新时间:2023-10-16

根据以下stackerflow答案,用户说:

这意味着变量对于翻译单元是局部的(简单地说,到单个源文件),并且不能从外部访问事实上,在当前的C++标准中不赞成使用static-相反,您应该使用匿名名称空间:

static int x = 0;

应该是:

namespace {
    int x = 0;    
}

我并不反对匿名名称空间是首选方法,
但是现在真的不赞成使用static吗
标准在哪里这么说?

否,它目前没有被弃用。有一次,但由于C的可比性问题,情况发生了逆转。在1999年之前的某个时候,它被否决了,这导致了缺陷报告174,其中写道:

应该推翻否决全局静态的决定。

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

这导致缺陷报告223,其中折旧的含义从修订而来

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

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

然而,该定义似乎表明,任何未被否决的功能都"保证在未来的修订中成为标准的一部分"。目前尚不清楚这一含义是否有意,因此可能需要对该定义进行修订。

并将弃用的含义更改为:

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

后来,由于C兼容性问题,缺陷报告1012:取消了该功能

尽管7.3.1.1[namespace.namename]指出,由于未命名的命名空间提供了一种优越的替代方案,因此不赞成在命名空间范围内使用static关键字来声明变量,但在可预见的未来,该功能不太可能在任何时候被删除,特别是考虑到C兼容性问题。委员会应考虑取消这种贬低。