我对在 C 中使用 static
关键字作为文件内变量的作用域限制很感兴趣。
我认为构建 C 程序的标准方式是:
- 有一些定义函数和变量的 c 文件,可能使用
static
进行作用域限定。 - 有一些声明与之相应的 c 文件的函数和可能的变量的 h 文件,供其他 c 文件使用。私有函数和变量不会公开在 h 文件中。
- 每个 c 文件被单独编译为一个 o 文件。
- 所有的 o 文件被链接在一起形成一个应用程序文件。
如果变量没有在 h 文件中公开,我认为有两个原因可以声明一个全局变量为 static
:
- 一个是为了可读性。通知未来的读者(包括我自己),变量没有在任何其他文件中访问。
- 第二个是为了防止另一个 c 文件将变量重新声明为
extern
。我想链接器不喜欢一个变量既是extern
又是static
。(我不喜欢一个文件重新声明别人拥有的变量作为extern
,这种做法是否合适?)
还有其他原因吗?
static
函数也是如此。如果原型没有在 h 文件中公开,其他文件可能根本不会使用该函数,那么为什么要定义它为 static
呢?我看到同样的两个原因,但没有更多的原因。
static
并不限制作用域,它提供了内部链接。如果你将翻译单元视为作用域,那么它是相似的,但不是正确的术语。 - Gauthier