关于头文件,全局变量,extern,st…

1、今天在复习C++的时候,看到关于#include语句的一个解释,如果B 中 #include A,就是将文件A拷贝到#include A的位置中。
2、根据这个原理,于是做了一个实验。在头文件中定义一个变量(非静态变量),同时声明一个fun函数。再写一个fun.c文件,fun.c文件中实现了fun函数,最后写一个main.c文件调用fun函数。
三个文件的源代码如下:
test.h文件:
关于头文件,全局变量,extern,static
关于头文件,全局变量,extern,static
main.c文件
关于头文件,全局变量,extern,static
关于头文件,全局变量,extern,static
fun.c文件
关于头文件,全局变量,extern,static
关于头文件,全局变量,extern,static
3、编译没有问题,但是运行的时候,在链接的时候报错,”[Error] E:\study\code\test\static\main.cpp:2: multiple definition of `com'“,即com变量有多个定义。这是很让人困惑的事情,变量虽然是在头文件中定义的,但是根据预编译的原理,会将其展开在文件中了,即com相当于是在main.c和fun.c中定义的两个相同名字的全局变量。于是,问题变成了一个多个文件组成的程序中,定义在某个文件中的全局变量的作用于是否是整个程序,而并非仅仅是定义该变量的文件,这是显然的。
4、到这里,自然而然会想到一些编程习惯,即在头文件中一般不会直接定义变量和函数,而是定义静态变量或者类型。可见直接定义变量的确会导致错误。即如果只有一个c文件使用了这个头文件并不会产生错误,但是如果有多个c文件使用该头文件就会产生重复定义变量的问题。
5、那么如果为什么可以在头文件中定义静态变量呢?于是将com变量改成static int类型的,编译运行。
test.h文件:
关于头文件,全局变量,extern,static
关于头文件,全局变量,extern,static
main.c文件
关于头文件,全局变量,extern,static
关于头文件,全局变量,extern,static
fun.c文件
关于头文件,全局变量,extern,static
关于头文件,全局变量,extern,static
编译运行都可以成功,但是输出却是0,而不是4。这个就需要解释头文件中定义static变量的问题了,头文件中定义的static变量,在c文件中使用时会在静态存储区分别开辟存储区,即两个static变量并不指向同一个地址。那么如果非要使得输出是4又该怎么做呢,这就需要使用extern修饰符来修饰一个全局变量了,因为,extern变量声明的时候并不指向某个空间,只是使用一个标识符方便编译,链接之后才会指向实际的位置。于是,修改程序,使用extern变量来引用另一个文件的外部变量,输出结果的确是4.
test.h文件:
关于头文件,全局变量,extern,static
关于头文件,全局变量,extern,static
main.c文件
关于头文件,全局变量,extern,static
关于头文件,全局变量,extern,static
fun.c文件
关于头文件,全局变量,extern,static
关于头文件,全局变量,extern,static
6、总结以下:extern变量可以声明一个外部变量,使得编译顺利用过,但是在链接之后才得到实际的变量。全局变量的在运行过程中对整个程序都是有效地,当然编译的时候,因为是按文件进行编译的,所以不会影响。每一个文件中定义的静态变量都会在静态存储区中分别分配一个空间。 在头文件中一般不会直接定义变量和函数,而是定义静态变量或者类型。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值