2012-04-03 193 views
0

对不起,这是一个基本的问题,但我所有的研究只是勉强错过回答我的问题,我只是想仔细检查之前,我写我有一个假设所有代码。 我使用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]; 
    } 
} 

回答

3

这是正确的。这就是为什么他们被称为“全局”变量:他们在任何范围内都可用。

+0

好的。谢谢。在我需要重写代码或发生大量错误之前,我只是想确定一下。 – Sams 2012-04-03 03:46:27

+2

现在你知道它们是什么了,明智地使用它们。不要仅仅为了避免传递参数而使用它们。在有全局数据的情况下有意义使用它们(即需要一个实例并在很多地方引用)。全球数据存在*许多*下行风险。小心踩踏。 – 2012-04-03 03:56:59

+2

但是,您不仅在头文件中声明了变量,还定义了它们。你不应该这样做:如果有几个模块使用相同的hader,你会得到名称冲突。 – Matthias 2012-04-03 03:57:08

1

你必须要小心这里。 “环球”变量是那些可在代码中的任何一点,但有全球标准没有正式定义 - 它使用类似范围,存储时间和联动较正式用词。全球的

一个定义适用于单个文件,另一个可以跨多个文件应用。

随着您的特定设置,如果您在多个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的所有文件访问副本。


就使用全局变量而言,通常应尽可能地避免。使用它们会使封装变得更加困难,并使代码的内部暴露于外部。

基本规则是使用尽可能小的范围为任何单个项目,仍然允许您达到目的。有时候,这意味着要传递信息。

如果你真的不想传递它们,至少要将所有数据和操作它的代码隔离到一个文件中,以便你可以将它隐藏起来。

6

请注意,您所写的头文件定义了全局变量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?

注意,全局变量通常不是一个好主意;很难跟踪哪些代码正在访问并修改它们。人们竭尽全力避免全局变量。全局常量是另一回事;他们提出的问题较少,尽管你仍然不愿意使用它们。

2

您提供的示例是正确的,但很容易出现“重新声明”链接器错误。

使用全局变量的首选方法是:


/* example.h */ 
extern int state; 
extern int lnArray[]; 

/* example.c */ 
int state; 
int lnArray[SOME_SIZE_HERE]; 

通过你能够#include <example.h>尽可能多的时间,因为你喜欢的头文件声明extern S,从不同的源文件只要你喜欢,没有statelnArray被重新声明。