C中的全局变量和函数

时间:2012-04-03 03:42:52

标签: c variables global

对不起,这是一个基本问题,但我的所有研究都几乎没有回答我的问题,我只是想在我编写所有代码之前仔细检查。 我正在使用C并且我有一个头文件,其中声明了一些变量(int s,char数组,int数组)。如果我有一个使用这些全局变量的函数,我假设我可以使用变量而不传递它们吗?

实施例 HEADER FILE:

int state;
int lnArray[];

C FILE:

void function(){ 
    int i;
    for(i=0;i<5;i++;){
        if(lnArray[i]<10)    
        state = lnArray[i];
    }
}

5 个答案:

答案 0 :(得分: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?

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

答案 1 :(得分:3)

这是对的。这就是为什么它们被称为“全局”变量:它们可以在任何范围内使用。

答案 2 :(得分:2)

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

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


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

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

通过在头文件中声明extern,您可以#include <example.h>尽可能多地使用statelnArray或{ {1}}被重新宣布。

答案 3 :(得分:1)

是的,如果您打算将其包含在其他标题中,请小心。

http://tread.wordpress.com/2007/06/18/declaring-global-variables-in-header-files/

Are global variables bad?

答案 4 :(得分: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.

这意味着所有文件都可以访问的{em>一个副本state


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

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

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