为什么我们只应在类或函数(C ++)中使用'static'?

时间:2012-07-02 17:15:56

标签: c++ static keyword linkage

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

  

“在C和较旧的C ++程序中,使用关键字static(令人困惑)   意思是“使用内部联系”。除内部功能外,不要使用静态   和班级。“

问题在于,进一步阅读,作者没有详细说明为什么这是不好的做法。我经常在我的代码中使用静态函数进行一些简单的计算,这在编译单元之外是不需要的,但是我从来没有意识到这是不赞成的,而且我不明白为什么它是坏的。有人可以为我解释这个吗?

2 个答案:

答案 0 :(得分:5)

我认为这个想法不是对内部联系不屑一顾,而是为了避免与static的新含义混淆:static有太多含义(宣称具有内部联系的东西,定义本地具有静态存储持续时间的变量,标记类的非实例成员),因此避免使用一个不太直观的变量是件好事。

因此,C ++ 98标准提供了另一种使用内部链接声明内容的方法:unnamed namespaces,并在声明命名空间作用域中的对象时弃用static“。

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

答案 1 :(得分:4)

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

我认为在这种情况下,static因为双重含义而被不赞成,而且这两个含义相反的事实 - 如果在classstruct内表示一个全局状态,而在它之外它提供内部链接并为每个翻译单元提供变量或方法的副本。

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

namespace  //OK
{
    class X {};
}

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

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