静态成员与静态全局

Static member vs static global

本文关键字:全局 静态 静态成员      更新时间:2023-10-16

我读到全局变量和静态全局变量之间的区别在于,全局变量可以通过extern在另一个实现文件中引用,而静态全局变量仅本地化到该实现文件。有关详细信息,请参阅以下两个问题:[1,2]。

据我所知,这意味着下面的foo()bar()应该相同地链接。这两个函数只能由MyClass使用。

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

我可以看到foo()的声明更常见,因为它可以让头文件更完整地布局整个类(即使你不能/不应该使用私有的东西),但声明bar()这样的函数(隐藏在头文件中)是不是不好?

就上下文而言,我为windows消息定义了一个WNDPROC,它需要是静态的才能工作,但这是一个相当丑陋的声明,我不确定是应该将其完全隐藏在实现文件中,还是继续在头文件中声明。

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

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

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

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

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

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

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

这类似于

static void hiddenfunc();

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