为什么我们只在类或函数中使用"静态"(C++)?
Why should we only use 'static' inside a class or a function (C++)?
我最近在读Stroustrups The C++ Programming Language,在第9章关于Linkage的章节中,我看到了以下段落:
"在C和更早的C++程序中,关键字static(令人困惑地)被使用。 意思是"使用内部联系"。除内部函数外,不要使用静态 和课程。
问题是,进一步阅读,作者没有详细说明为什么这是不好的做法。我不时在我的代码中使用静态函数,通常用于编译单元之外不需要的一些简单计算,但我从未意识到这是不受欢迎的,而且对我来说并不明显为什么它不好。谁能为我阐明这一点??
我认为这个想法不是要皱眉内部链接,而是要避免与static
的新含义混淆:static
有太多的含义(用内部链接声明东西,用静态存储持续时间定义局部变量,标记类的非实例成员),所以避免一个不太直观的是一件好事。
正因为如此,C++98 标准提供了另一种声明具有内部链接的内容的方法:未命名的命名空间,并弃用static
"在命名空间范围内声明对象时"。
C++11 标准删除了这种弃用(并且还以某种方式更改了未命名命名空间的语义,实际上不需要内部链接),所以现在它实际上是一个风格问题。
因为C++应该首选匿名命名空间,它们基本上提供相同的功能。
我认为在这种情况下static
是不受欢迎的,因为双重含义,以及两种含义完全相反的事实 - 如果在class
或struct
内部,它代表全局状态,而在外部它提供内部链接并为每个翻译单元提供变量或方法的副本。
此外,static
只能应用于函数和变量,而在匿名命名空间中,您可以有类型声明。
namespace //OK
{
class X {};
}
static class X //syntactically correct, but does nothing
{
};
请注意,该标准认为使用 static
将链接指定为已弃用。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- C++从另一个类访问公共静态向量的正确方法是什么
- 基于boost的程序的静态链接——zlib问题
- 在静态库中嵌入类方法
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在C++中获得"静态纯虚拟"功能?
- 私有类型的静态常量成员
- 使用gcc从静态链接的文件中查找可选符号
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 如何在C++中使用非静态成员函数作为回调函数
- 将静态库链接到不带-fPIC的共享库中
- 静态结构和一个定义规则
- 为什么虚函数不能是静态的和全局的?
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身