为什么我们应该只使用';静态';在类或函数(C+;+;)中? 我最近读了C++编程语言StruouStruts,在第9章的链接中,我遇到了以下段落: 在C和老C++程序中,关键字静态是(令人困惑的)使用。 意思是“使用内部链接”。除了内部函数外,不要使用静态链接 和班级。”

为什么我们应该只使用';静态';在类或函数(C+;+;)中? 我最近读了C++编程语言StruouStruts,在第9章的链接中,我遇到了以下段落: 在C和老C++程序中,关键字静态是(令人困惑的)使用。 意思是“使用内部链接”。除了内部函数外,不要使用静态链接 和班级。”,c++,static,keyword,linkage,C++,Static,Keyword,Linkage,问题是,在进一步阅读之后,作者没有详细说明为什么这是一种不好的做法。我经常在我的代码中使用静态函数,通常用于编译单元之外不需要的一些简单计算,但我从未意识到这是不受欢迎的,我也不清楚为什么它不好。有人能帮我解释一下吗 > P>因为在C++匿名命名空间中应该是首选的,它基本上提供相同的功能。 我认为在这种情况下,static是不受欢迎的,因为它有双重含义,而且这两种含义是完全相反的——如果在类或结构中,它代表一个全局状态,而外部则提供内部链接,并向每个翻译单元提供变量或方法的副本 此外,stati

问题是,在进一步阅读之后,作者没有详细说明为什么这是一种不好的做法。我经常在我的代码中使用静态函数,通常用于编译单元之外不需要的一些简单计算,但我从未意识到这是不受欢迎的,我也不清楚为什么它不好。有人能帮我解释一下吗

> P>因为在C++匿名命名空间中应该是首选的,它基本上提供相同的功能。 我认为在这种情况下,
static
是不受欢迎的,因为它有双重含义,而且这两种含义是完全相反的——如果在
类或
结构中,它代表一个全局状态,而外部则提供内部链接,并向每个翻译单元提供变量或方法的副本

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

namespace  //OK
{
    class X {};
}

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

请注意,该标准认为使用
static
来指定Linkedage是不可取的。

我认为这个想法不是不赞成内部链接,而是为了避免与
static
的新含义混淆:
static
的含义太多了(使用内部链接声明内容,使用静态存储持续时间定义局部变量,标记类的非实例成员),因此避免使用不太直观的变量是一件好事

正因为如此,C++98标准提供了另一种使用内部链接声明内容的方法:,并反对“在命名空间范围中声明对象时”使用
static


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

对于close vote的所有者:这怎么不是建设性的呢?也许这有点帮助。另外一个事实是,您不能使用
静态
对象或函数来实例化模板。(还有一个有点矛盾的事实,即命名空间范围内的
const
变量默认为
静态
)C++11删除了对模板参数的不推荐和愚蠢的限制。不再有任何特别的理由选择其中一个参数而不是另一个。未命名的名称空间不会使其内容具有内部链接。它们将其放置在一个名称空间中,该名称空间不能在翻译单元之外命名,但链接仍然是外部的,这意味着对模板有区别。@JamesKanze:它对模板还是有区别的,还是你指的是2011年以前的语言?@JamesKanze:对模板有什么区别?