我在一个完全空的 C++ 文件中定义了一个静态变量,使用惯例使用 S_ 来表示这个变量是静态的,将其值设置为 5。它整体上看起来和其他变量是一样的,只不过在它前面的是 static 关键字,这意味着这个变量只会在当前这个转换单元内部链接。
如果你还不知道 C++ 编译和链接是如何工作的,可以回去看一看 C++ 编译和链接的那一期,因为你真的需要了解发生了什么,然后才能学习本期的内容。
静态变量或函数意味着当需要将这些函数或变量与实际定义的符号链接时,链接器不会在这个转换单元的作用域之外的地方寻找那个符号定义。
静态变量
我们拿实际的代码来解释一下。
i6RtcX.png
在第一个例子中,我们创建了一个静态变量,并将它设为 5,然后去另一个 C++ 文件,也就是另一个转换单元,一个带有main函数空白 C++ 文件。在这里创建一个全局变量。将它与之前静态变量设置一样的名字。其值设置为十,打印这个变量。
运行之后,我们可以看到,程序是可以编译的,不会遇到任何问题。
然后我们回到 Static.cpp 文件,删除了static 关键字。再次编译刚刚的代码。你会发现当它进入链接状态阶段时,会报一个链接错误。因为这个 s_Variable 变量已经在另一个转换单元中定义过了,当然是这样的,我们不能有两个同名的全局变量。
这就是 C++ 中静态的全部含义。
当你在类和结构体之外使用静态时,它只是意味着你声明的静态函数或静态变量只会在它所在的文件中被看到。
如果你想在头文件中声明一个静态变量,将头文件包含在两个不同的 C++ 文件中。其实和上面的例子是一样的,都是在两个转换单元中都声明了相同的 s_Variable 变量为静态变量。当然,当你包含那个头文件时,它会复制所有内容并将其粘贴在 C++ 文件中。也就是将一个静态变量放到两个不同的转换单元中,这个你要留意一下。
最后的话