您需要在这里小心。 “全局”变量是在代码中的任何点都可用的变量,但标准中没有正式的全局定义 - 它使用更正式的术语,如范围、存储持续时间和链接。
全局的一种定义适用于单个文件,另一种可以适用于多个文件。
通过您的特定设置,如果您将该头文件包含在多个 C 源文件中,然后尝试将它们链接在一起,您将收到链接错误,因为每个目标文件都有其 自己的副本变量,并且它们全部都在尝试导出它们。
如果您希望变量对于单个源文件是全局的,请将它们放在该源文件的顶部并使其成为静态(实际上对链接器不可见):
static int state;
这意味着该文件中的每个函数都可以访问它们,但它们不会干扰其他文件。
但是,如果您希望变量在所有源文件中都是全局的,请将 声明 放在头文件中,将 定义 放在一个 C 源文件中。声明声明某事物存在,而定义使其存在:
something.h:
extern int state; // declare it
file1.c:
#include "something.h" // declare it (in header)
int state; // AND define it.
// Now you can use state anywhere.
file2.c:
#include "something.h" // declare it (in header)
// Now you can use state anywhere.
这意味着所有文件都可以访问 一个 state 的副本。
在使用全局变量方面,一般要尽量避免。使用它们会使封装变得更加困难,并将代码的内部暴露给外部操作。
基本规则是对任何单个项目使用尽可能小的范围,这仍然可以让您实现目标。有时,这意味着传递信息。
如果你真的不想传递它们,至少将所有数据和操作它的代码隔离到一个文件中,这样你就可以隐藏它。