你必须要小心这里。 “环球”变量是那些可在代码中的任何一点,但有全球标准没有正式定义 - 它使用类似范围,存储时间和联动较正式用词。全球的
一个定义适用于单个文件,另一个可以跨多个文件应用。
随着您的特定设置,如果您在多个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
的所有文件访问副本。
就使用全局变量而言,通常应尽可能地避免。使用它们会使封装变得更加困难,并使代码的内部暴露于外部。
基本规则是使用尽可能小的范围为任何单个项目,仍然允许您达到目的。有时候,这意味着要传递信息。
如果你真的不想传递它们,至少要将所有数据和操作它的代码隔离到一个文件中,以便你可以将它隐藏起来。
好的。谢谢。在我需要重写代码或发生大量错误之前,我只是想确定一下。 – Sams 2012-04-03 03:46:27
现在你知道它们是什么了,明智地使用它们。不要仅仅为了避免传递参数而使用它们。在有全局数据的情况下有意义使用它们(即需要一个实例并在很多地方引用)。全球数据存在*许多*下行风险。小心踩踏。 – 2012-04-03 03:56:59
但是,您不仅在头文件中声明了变量,还定义了它们。你不应该这样做:如果有几个模块使用相同的hader,你会得到名称冲突。 – Matthias 2012-04-03 03:57:08