c语言工程里其它文件引用全局变量?

工程包含a.c b.c
在a.c文件里有一个全局变量 list
b.c里有一个全局变量 test

问:1、若b.c里的函数要改变a.c 里全局变量的值,可否直接在b.c 里extern list 然后直接调函数修改?

2、a.c 调用b.c里的函数test_change(test)修改test的值
然后a.c再调用b.c里的函数test_show(test)显示test的值,这里的test值是前面test_change修改的值吗?我的意思是,b.c里的全局变量保存在哪里?不需要return给a.c也能保存值吗?

    åœ¨C语言中引用外部变量,一般使用extern关键字。举个例子如下:

//1.c ä¸­å®šä¹‰ä¸€ä¸ªå˜é‡g_a
int g_a = 100;

//2.c ä¸­å®šä¹‰ä¸€ä¸ªå‡½æ•°è¾“出g_a
#include <stdio.h>
extern int g_a; //这里需要用extern说明g_a是一个外部全局变量
void f() {
    printf("%d\n", g_a);
}

//3.c main函数中调用f()
void f(); //声明函数f()
int main()
{
    f();
}

说明:在2.c中如果不使用extern关键字,则会出现编译错误提示。写入extern int g_a声明后,则编译成功。

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-01-25
1. 可以。全局变量本身具有外部链接特性。extern list可以让编译器在编译时暂时用一个临时的标识符表示list,等到链接时去其他链接文件里找到正确的list的定义,并替换掉b.c中使用到的地方,最终相当于b.c中直接使用了a.c中的list。
2. 如果你的test_change里面确实有修改到的全局的test,那这里的test值就是test_change修改的值。
全局变量的作用域是整个源程序,它和静态变量一样都统一保存在全局静态存储区。因此对于整个源程序来说(包括a.c和b.c),只有一个test和list,在哪里对它进行修改,效果都是一样的。本回答被提问者和网友采纳
第2个回答  2011-05-21
1.如何引用一个已经定义过的全局变量?   
答:extern  可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
  
2.全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?   
答:可以,在不同的C文件中以static形式来声明同名全局变量。   可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错
3.通过下例要看出static全局变量与普通的全局变量有什么区别来?
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误

引用(有代码展示):http://blog.csdn.net/rwjlqn/archive/2010/01/21/5219655.aspx

参考资料:http://blog.csdn.net/rwjlqn/archive/2010/01/21/5219655.aspx

第3个回答  2011-05-14
在c语言中
关于多文件编译的问题,
可以这样理解
因为对于编译来说,最后编译的只有一个文件
文件的包含,我们可理解成,代码的直接插入。
a.c
…………
int list;
test_change(test);
…………
b.c
extern list;
int test;
test_change(test){}
…………
合起来呢,一种情况如下(b包含a)
int list;
test_change(test);
extern list;
int test;
test_change(test){}
全局变量保存在哪里~
程序运行时,所有全局变量都会在内存中分配到空间。而且持续到程序结束
第4个回答  2011-05-14
第一个问题那样做是可以的

第二个问题:因为test是全局变量,也就是说它是在程序没有运行之前就已经分配好地址了,以后每次用的时侯从地址里读就可以了,所有你每次用的test都是只是一个,改完再放回去,用的时侯再拿出来

c语言工程里其它文件引用全局变量?
在C语言中引用外部变量,一般使用extern关键字。举个例子如下:\/\/1.c 中定义一个变量g_aint g_a = 100;\/\/2.c 中定义一个函数输出g_a#include <stdio.h>extern int g_a; \/\/这里需要用extern说明g_a是一个外部全局变量void f() { printf("%d\\n", g_a);}\/\/3.c main函数中调用f...

怎样使C语言全局变量在多个文件中使用?
extern 关键字\\x0d\\x0aextern int i;这样就可以在其他文件中使用\\x0d\\x0a在头文件中声明\\x0d\\x0aa.h\\x0d\\x0aextern int i;\\x0d\\x0a在其他某个c文件中定义\\x0d\\x0aint i =0;\\x0d\\x0a其他要使用i变量的c源文件只需要include"a.h"就可以 ...

在C语言中,一个文件中定义的 全局变量,在另一个文件中能用吗
能。因为全局变量默认是extern的,函数也是。如果你写了static修饰它就不行了

c语言 为什么静态全局变量可以在别的文件中引用
静态全局变量只能在本源文件中使用,意思是你不能用extern 来声明另外一个文件里的静态全局变量 比如 A文件里的static int i =0;那么B文件里extren int i就是行不通的,而如果A文件的i不是static的 , 那么extern int i就可以

单片机Keil C51 C语言多文件如何使用全局位变量?跪拜!!
extern就可以。在一个文件里定义:bdata m;sbit x=m^1;然后在另一个文件里声明:extern bdata m;(如果不使用m可以不声明。)extern bit x;这样就可以使用了。如果变量较多,建议楼上的方法,用全局头文件。

c语言 中 为什么不将全局变量的定义放在头文件中
首先要说明什么是全局变量,c语言中全局变量一般是指定义在函数体外的变量。全局变量按可访问性可分为外部变量和内部变量。内部变量是指使用了static关键字修饰的全局变量,它的可访问范围(作用域)被限定在本源文件所在的链接文件模块中,不能被其它文件模块引用。反之没有被static关键字修饰的全局变量则是...

C语言 static全局变量只被初始化一次 防止在其他源文件中被引用 这句...
c文件之间是可以相互引用的,就像函数一样可以被相互引用。当 变量被 static 修饰的时候( 例如:static int a = 1;),只有文件第一次执行这个语句的时候 a 被赋值成 1,当其他的文件或本文件第二次执行这个语句的时候不改变 a 的值(例如:如果a在后面的代码中 加1,那么这时候执行这条语句时...

C语言如何在两个文件中访问同一个全局变量
最好的实践是:建立一个头文件, 在头文件中声明变量 extern <type> ;表示在外部链接该变量.变量则可以在任意源文件中定义.

C语言中某一个文件里定义的static变量,那么另一个文件能否读取这个变 ...
(b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。(c)具有外部链接的静态;可以在所有源文件里调用;除了本文件,其他文件可以通过extern的方式引用;静态全局变量的作用:(a)不必担心...

C语言中全局变量可以是非静态变量吗
在C语言中,全局变量可以是非静态变量的。原因如下:静态变量的关键static对局部变量和全局变量的作用不一样。对于局部变量来说,用static修饰时,该变量在函数调用后的值一直保持上次的结果。对于全局变量来说,用static修饰的全局变量表示这个全局变量只能在当前这个全局变量定义的文件内使用;如果没有static...

相似回答