为什么我们只在类或函数中使用"静态"(C++)?

Why should we only use 'static' inside a class or a function (C++)?

本文关键字:静态 C++ 我们 函数 为什么      更新时间:2023-10-16

我最近在读Stroustrups The C++ Programming Language,在第9章关于Linkage的章节中,我看到了以下段落:

"在C和更早的C++程序中,关键字static(令人困惑地)被使用。 意思是"使用内部联系"。除内部函数外,不要使用静态 和课程。

问题是,进一步阅读,作者没有详细说明为什么这是不好的做法。我不时在我的代码中使用静态函数,通常用于编译单元之外不需要的一些简单计算,但我从未意识到这是不受欢迎的,而且对我来说并不明显为什么它不好。谁能为我阐明这一点??

我认为这个想法不是要皱眉内部链接,而是要避免与static的新含义混淆:static有太多的含义(用内部链接声明东西,用静态存储持续时间定义局部变量,标记类的非实例成员),所以避免一个不太直观的是一件好事。

正因为如此,C++98 标准提供了另一种声明具有内部链接的内容的方法:未命名的命名空间,并弃用static"在命名空间范围内声明对象时"。

C++11 标准删除了这种弃用(并且还以某种方式更改了未命名命名空间的语义,实际上不需要内部链接),所以现在它实际上是一个风格问题。

因为C++应该首选匿名命名空间,它们基本上提供相同的功能。

我认为在这种情况下static是不受欢迎的,因为双重含义,以及两种含义完全相反的事实 - 如果在classstruct内部,它代表全局状态,而在外部它提供内部链接并为每个翻译单元提供变量或方法的副本。

此外,static只能应用于函数和变量,而在匿名命名空间中,您可以有类型声明。

namespace  //OK
{
    class X {};
}
static class X //syntactically correct, but does nothing
{
};

请注意,该标准认为使用 static 将链接指定为已弃用