在确保翻译单元之间的可用性时,不赞成使用静态
Is static deprecated when ensuring availability between translation units?
根据以下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兼容性问题。委员会应考虑取消这种贬低。
相关文章:
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- 如何在不使用静态矩形方法的情况下创建 IDOMPathGeometryPtr?
- 当我链接动态库而不是静态库时,CMake 有效
- C++:找不到静态链接
- 为什么不允许静态成员变量的初始化在类中,而允许静态静态成员的初始化
- 枚举不是非静态数据成员或类的基类
- 获取 constexpr 全局变量(不是静态成员)的链接器符号
- 包括不排除静态库项目的用户路径的路径
- 如何初始化不是静态的const成员
- Xcode 找不到C++静态库
- C 中不允许静态/全局变量
- GCC 警告未使用的静态函数,但不警告静态内联:是否有实际区别?
- 有没有办法强制c++编译器不优化静态库中的特定静态对象
- Visual Studio 2015 curl不会静态链接
- 递归计算在不使用静态局部变量,全局变量或静态函数的情况下,在递归函数中发生的环数
- 我可以在此处使用全局变量,而不是静态变量
- Xcode 在链接期间找不到静态库,即使它是引用的产品
- 不赞成将字符串文字转换为char*
- 为什么 std::array::size 不是静态的?
- 在确保翻译单元之间的可用性时,不赞成使用静态