关于c ++:静态关键字的弃用……不再?

Deprecation of the static keyword… no more?

在C++中,可以使用翻译单元中的EDCOX1×0关键字来影响符号的可见性(变量或函数声明)。

在N3092中,这已被弃用:

Annex D.2 [depr.static]
The use of the static keyword is deprecated when declaring objects in namespace scope (see 3.3.6).

在N3225中,已将其移除。

我能找到的唯一一篇文章有点非正式。

但它确实强调了,与C兼容(以及编译C程序作为C++的能力),这种厌恶是令人讨厌的。然而,编译一个C程序直接作为C++已经是一个令人沮丧的经验,所以我不确定它是否值得考虑。

有人知道为什么会改变吗?


在C++标准的核心语言缺陷报告和可接受的问题,修订版94下1012。他们注意到:

Although 7.3.1.1 [namespace.unnamed] states that the use of the static keyword for declaring variables in namespace scope is deprecated because the unnamed namespace provides a superior alternative, it is unlikely that the feature will be removed at any point in the foreseeable future.

基本上说,static的贬值并没有真正意义。它永远不会从C++中移除,它仍然是有用的,因为如果您想声明一个具有内部链接的函数或对象,则不需要使用未命名的命名空间所需的样板代码。


我会尽力回答你的问题,虽然这是一个古老的问题,看起来不太重要(它本身并不十分重要),而且它已经收到了相当好的答案。我之所以要回答这个问题,是因为当语言基于现有语言时,它涉及到标准演进和语言设计的基本问题:什么时候应该不推荐、删除或以不兼容的方式更改语言功能?

In C++ it is possible to use the static keyword within a translation unit to affect the visibility of a symbol (either variable or function declaration).

实际上是连接。

In n3092, this was deprecated:

折旧表示:

  • 将来删除某些功能的意图;这并不意味着不推荐使用的功能将在下一个标准版本中删除,也不意味着它们必须"很快"删除,或者完全删除。在下一个标准版本中,可以删除不推荐使用的功能。
  • 阻止使用的正式尝试。

后一点很重要。虽然从来没有正式的承诺,你的程序不会被破坏,有时是无声的,以下一个标准,委员会应该尽量避免破坏"合理"的代码。贬义应该告诉程序员依赖某些特性是不合理的。

It does underline though, that for compatibility with C (and the ability to compile C-programs as C++) the deprecation is annoying. However, compiling a C program directly as C++ can be a frustrating experience already, so I am unsure if it warrants consideration.

保存C/C++公共子集是非常重要的,特别是对于头文件。当然,static全局声明是具有内部链接的符号声明,这在头文件中不太有用。

但是这个问题绝不仅仅是与C的兼容性,它与现有C++的兼容性:有大量现存的有效的C++程序使用EDCOX1×0的全局声明。这段代码不仅是正式的合法代码,而且是合理的,因为它使用了一种定义良好的语言特性,即其预期的使用方式。

仅仅因为现在有一种"更好的方法"(根据一些人的说法)来做一些事情,并不会使程序写的老方法"坏"或"不合理"。在C和C++社区中,在全局范围内使用对象的EDCOX1"0"关键字的能力是很好理解的,并且最常用的是正确的。

同样,我不打算仅仅因为"C-style casts不好",就将C-style casts改为double改为static_cast,因为static_cast增加了零信息和零安全性。

每当一种新的方法被发明出来,所有的程序员都会争先恐后地重写他们现有的定义良好的工作代码,这种想法简直是疯了。如果你想删除所有继承的C丑陋和问题,你不改变C++,你发明了一种新的编程语言。半删除一个EDCOX1(0)的用法几乎不会使C++的C难看。

代码更改需要理由,"旧的是坏的"永远不是代码更改的理由。

打破语言变化需要强有力的理由。使语言变得非常简单永远不是一个突破性改变的理由。

为什么EDOCX1 0的坏原因是非常弱的,甚至不清楚为什么不把对象声明和函数声明放在一起——给予它们不同的处理几乎不能使C++更简单或更正交。

所以,真的,这是一个悲伤的故事。不是因为它有实际的后果:它没有实际的后果。但因为它显示出明显缺乏ISO委员会的常识。


不管是否已弃用,删除此语言功能将破坏现有代码并使人恼火。

整个静态贬低的事情只是一厢情愿地沿着"匿名名称空间比静态名称空间更好"和"引用是更好的指针"的路线思考。大声笑.