对不起,这是一个基本问题,但我的所有研究都几乎没有回答我的问题,我只是想在我编写所有代码之前仔细检查。
我正在使用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];
}
}
答案 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>
尽可能多地使用state
或lnArray
或{ {1}}被重新宣布。
答案 3 :(得分:1)
http://tread.wordpress.com/2007/06/18/declaring-global-variables-in-header-files/
答案 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
。
在使用全局变量方面,通常应尽可能避免使用全局变量。使用它们会使封装变得更加困难,并使代码的内部暴露于外部操作。
基本规则是对任何单个项目使用尽可能小的范围,这仍然允许您实现目标。有时,这意味着传递信息。
如果你真的不想传递它们,至少将所有数据和操作它的代码隔离到一个文件中,这样你就可以隐藏它。