c语言工程里其它文件引用全局变量?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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关键字。举个例子如下:
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声明后,则编译成功。
参考技术A 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,在哪里对它进行修改,效果都是一样的。本回答被提问者和网友采纳 参考技术B 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
参考技术C 在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)
全局变量保存在哪里~
程序运行时,所有全局变量都会在内存中分配到空间。而且持续到程序结束 参考技术D 第一个问题那样做是可以的
第二个问题:因为test是全局变量,也就是说它是在程序没有运行之前就已经分配好地址了,以后每次用的时侯从地址里读就可以了,所有你每次用的test都是只是一个,改完再放回去,用的时侯再拿出来
C语言全局变量(c文件和h文件中的全局变量静态全局变量)使用注意事项
C语言在头文件中包含全局变量有三种形式:
1 在头文件中声明一个全局变量,在一个C文件中定义全局变量,然后在所有的引用了这个头文件的C文件里都可以使用该全局变量值。
如在main.c定义
int a = 3;
然后定义一个main.h,那么所有引用main.h的c文件中,均可以访问a并更改其值。
2 在头文件中定义一个静态全局变量。那么所有引用该头文件的C文件,均拥有一个作用域在本文件范围内的同名静态全局变量。不同文件中的该变量虽然同名,但却是不同的变量。
比如在a.h中定义
static int a = 3;
那么在a.c中引用a.h,并将a值修改为4。
在b.c中也引用a.h,不对a值做修改,打印a值,仍为3, 不会因为a.c中的修改而改变值。
3 在头文件中定义全局变量。该头文件仅可以被一个C文件引用一次。
比如a.h中定义
int a = 3;
在a.c中可以引用a.h,并对a进行访问和修改。
如果在同项目下有b.c引用了a.h,编译器在链接时会报同名全局变量的错误,导致编译失败。
以上是关于c语言工程里其它文件引用全局变量?的主要内容,如果未能解决你的问题,请参考以下文章
C语言全局变量(c文件和h文件中的全局变量静态全局变量)使用注意事项