6

我已经读过全局变量和静态全局变量之间的区别在于全局变量可以通过外部在另一个实现文件中引用,而静态全局变量仅本地化到该实现文件。有关更多信息,请参阅这两个问题:[ 12 ]。

foo()据我了解,这意味着以下内容bar()应该以相同的方式链接。这两个功能只能由MyClass.

//MyClass.h
Class MyClass{
private:
  static void foo();
};

//MyClass.cpp
void MyClass::foo(){}
static void bar(){}

我可以看到foo()' 的声明更常见,因为它可以让头文件更完整地布局整个类(即使你不能/不应该使用私有的东西),但不好的做法是声明一个函数,如bar()(hidden from头文件)?

对于上下文,我正在定义一个WNDPROC需要静态才能工作的 Windows 消息,但这是一个相当丑陋的声明,我不确定是否应该将它完全隐藏在实现文件中或继续并在头文件中声明它.

4

1 回答 1

10

static 是一个非常可怕的关键字,因为它根据上下文具有许多不同的含义。静态变量和静态函数是完全不同的,类中的静态函数和静态自由函数是完全不同的。

类中的静态函数意味着该函数可以在没有类的实例的情况下调用,但它不能访问类的非静态成员。它有点像一个常规函数,只是为了整洁而包含在类中。

静态自由函数具有内部链接,因此在源文件之外无法看到它,并且它的名称可以在其他源文件中重用。

静态类函数没有内部链接。所有类函数都有外部链接。无论类函数是否为静态,您都可以在头文件和源文件之间拆分类函数。

我建议您阅读一些教程/书籍,以更清楚地了解静态的许多不同用途。当您在以前从未见过的地方看到静电时,不要假设!

如果你有一个想要隐藏在源文件中的自由函数,你可以将它声明为静态的。或者,您可以将其放置在未命名的命名空间中。

// cpp file only
namespace
{
    void hiddenfunc() {..}
}

这类似于

static void hiddenfunc();

并且可以以相同的方式调用它(就像“hiddenfunc()”一样)。未命名的名称空间(我知道这是一个奇怪的名称)的一个优点是您还可以放置类和其他定义,您只希望在该源文件中可见。只需确保在命名空间 {..} 区域内定义函数体。不要将未命名的命名空间放在头文件中。

于 2013-07-29T16:07:15.333 回答