6

我最近在阅读 Stroustrups The C++ Programming Language并且在第 9 章关于链接的部分中,我遇到了以下段落:

“在 C 和更早的 C++ 程序中,关键字 static (令人困惑地)用来表示“使用内部链接”。除了函数和类内部之外,不要使用 static。

问题是进一步阅读,作者没有详细说明为什么这是不好的做法。我不时在我的代码中使用静态函数,通常用于一些在编译单元之外不需要的简单计算,但我从来没有意识到这是不受欢迎的,我也不清楚它为什么不好。任何人都可以为我阐明这一点吗?

4

2 回答 2

5

我认为这个想法不是对内部链接皱眉,而是为了避免与static:的新含义混淆static),因此避免使用不太直观的一种是一件好事。

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

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

于 2012-07-02T17:20:16.590 回答
4

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

我认为static在这种情况下由于双重含义而皱眉,而且这两种含义完全相反 - 如果在 aclass或 a内部struct它代表一个全局状态,而在外部它提供内部链接并提供变量的副本或每个翻译单元的方法。

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

namespace  //OK
{
    class X {};
}

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

请注意,该标准认为使用static来指定 linkeage 为deprecated

于 2012-07-02T17:19:17.337 回答