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

3

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

It means that the variable is local to a translation unit (simply put, to a single source file), and cannot be accessed from outside it. This use of static is in fact deprecated in the current C++ Standard - instead you are supposed to use anonymous namespaces:

static int x = 0;

should be:

namespace {
    int x = 0;    
}

我并不反对使用匿名命名空间作为首选的方法,但是现在使用静态的确被弃用了吗?标准文件哪里说了这个?


1
不,它并没有被弃用。但是有些人希望它被弃用,原因对我来说不太清楚 :) - SergeyA
1
C++委员会似乎非常谨慎地处理他们所废弃的内容,因此如果他们以这种方式破坏静态行为,我会感到惊讶。 - Trevor Hickey
1
@TrevorHickey - 在全局范围内弃用 static 不会以任何方式破坏其行为,除非警告方面的设置过于激进。现在正确的代码将继续保持正确。 - Pete Becker
1
如果我没记错的话,这种用例在C++11中已被弃用,但后来又被取消了,因为每个人都意识到它是毫无意义的,由于C兼容性问题等原因,它永远不可能被删除。 - Praetorian
1
@TrevorHickey:没错,这就是“已弃用”意味着的:它仍然有效(但将来可能会被删除)。我听说他们试图这样做。但我印象中这从未出现在最终版本中。但我没有证据(这只是我记得听到的东西)。如果有人能给出明确的答案,那就太好了。 - Martin York
显示剩余4条评论
1个回答

2
不,它目前并未被弃用。虽然曾经有过一段时间被弃用,但由于与C兼容性问题而被撤销。在1999年之前的某个时候,它被弃用了,这导致了defect report 174的出现,其中写道:
“弃用全局静态应该被撤销。”
我们不能弃用静态,因为它是C语言中的重要部分,如果放弃它,将使C++与C不必要地不兼容。
由于模板可能会实例化匿名命名空间的成员,一些编译系统可能会将这些符号放置在全局链接器空间中,这可能会给链接器带来重大负担。没有静态,程序员就没有机制避免这种负担。
这导致了defect report 223的出现,其中“弃用”一词的含义被修改为:
“弃用被定义为:对于当前版本的标准规范,但不能保证在未来的修订版中成为标准的一部分。”
据指出,这意味着只有非弃用功能将在未来标准中得到支持:
“然而,这个定义似乎表明任何非弃用的功能都‘保证成为未来修订标准的一部分’。不清楚这个含义是否有意,因此可能需要修改这个定义。”
并将“弃用”的含义更改为:
“这些是弃用的功能,其中‘弃用’被定义为:对于当前版本的标准具有规范性,但已被确定为候选要从未来版本中删除。”
后来,由于与 C 的兼容性问题,该功能被取消弃用,详见 defect report 1012
“尽管 7.3.1.1 [namespace.unnamed] 规定,在命名空间作用域中使用 static 关键字声明变量是弃用的,因为无名命名空间提供了更好的替代方案,但考虑到与 C 的兼容性问题,不太可能在可预见的未来任何时候删除该功能。委员会应考虑取消该弃用。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接