全局变量和函数
对不起,这是一个基本的问题,但我所有的研究只是勉强错过回答我的问题,我只是想仔细检查之前,我写我有一个假设所有代码。 我使用C和我有声明一些变量,一个头文件(int
S,char
阵列,int
阵列)。如果我有一个使用这些全局变量的函数,我假设我可以在不传递它们的情况下使用这些变量?全局变量和函数
例 头文件:
int state;
int lnArray[];
C文件:
void function(){
int i;
for(i=0;i<5;i++;){
if(lnArray[i]<10)
state = lnArray[i];
}
}
这是正确的。这就是为什么他们被称为“全局”变量:他们在任何范围内都可用。
肯定的,但要小心一点,如果你打算把它列入了一些其它头。
http://tread.wordpress.com/2007/06/18/declaring-global-variables-in-header-files/
你必须要小心这里。 “环球”变量是那些可在代码中的任何一点,但有全球标准没有正式定义 - 它使用类似范围,存储时间和联动较正式用词。全球的
一个定义适用于单个文件,另一个可以跨多个文件应用。
随着您的特定设置,如果您在多个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
的所有文件访问副本。
就使用全局变量而言,通常应尽可能地避免。使用它们会使封装变得更加困难,并使代码的内部暴露于外部。
基本规则是使用尽可能小的范围为任何单个项目,仍然允许您达到目的。有时候,这意味着要传递信息。
如果你真的不想传递它们,至少要将所有数据和操作它的代码隔离到一个文件中,以便你可以将它隐藏起来。
请注意,您所写的头文件定义了全局变量state
(它声明了一个不完整的数组lnArray
);它应该只是宣布他们:
extern int state;
extern int lnArray[];
然后,在源文件中的一个(源文件,该文件还包括头),你写的:
int state = 0;
int lnArray[XXX]; // XXX is an enum or #define that gives the array size
或者你可以有lnArray
一个初始化这给出了数组的大小。
如果你的编译器使用'通用定义'机制,你可能会逃脱你得到的东西;很多人做但是添加一个初始化程序,你就会崩溃。
参见:What are extern variables in C?
注意,全局变量通常不是一个好主意;很难跟踪哪些代码正在访问并修改它们。人们竭尽全力避免全局变量。全局常量是另一回事;他们提出的问题较少,尽管你仍然不愿意使用它们。
您提供的示例是正确的,但很容易出现“重新声明”链接器错误。
使用全局变量的首选方法是:
/* example.h */
extern int state;
extern int lnArray[];
/* example.c */
int state;
int lnArray[SOME_SIZE_HERE];
通过你能够#include <example.h>
尽可能多的时间,因为你喜欢的头文件声明extern
S,从不同的源文件只要你喜欢,没有state
或lnArray
被重新声明。
好的。谢谢。在我需要重写代码或发生大量错误之前,我只是想确定一下。 – Sams 2012-04-03 03:46:27
现在你知道它们是什么了,明智地使用它们。不要仅仅为了避免传递参数而使用它们。在有全局数据的情况下有意义使用它们(即需要一个实例并在很多地方引用)。全球数据存在*许多*下行风险。小心踩踏。 – 2012-04-03 03:56:59
但是,您不仅在头文件中声明了变量,还定义了它们。你不应该这样做:如果有几个模块使用相同的hader,你会得到名称冲突。 – Matthias 2012-04-03 03:57:08