博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于头文件,全局变量,extern,static
阅读量:5889 次
发布时间:2019-06-19

本文共 1123 字,大约阅读时间需要 3 分钟。

hot3.png

  1. 今天在复习C的时候,看到关于#include语句的一个解释,如果B 中 #include A,就是将文件A拷贝到#include A的位置中。

  2. 根据这个原理,于是做了一个实验。在头文件中定义一个变量(非静态变量),同时声明一个fun函数。再写一个fun.c文件,fun.c文件中实现了fun函数,最后写一个main.c文件调用fun函数。

  3. 三个文件的源代码如下:

test.h#include 
#include 
void fun();int com;
fun.c#include "test.h"void fun(){    com = 0;}
main.c#include "test.h"int main(){    com = 4;    fun();    printf("%d\n", com);    return 0;}

, 很明显在链接的时候必然会出现“multiple definition of `com'”。一般而言也不会在头文件中定义变量和函数。只可以声明变量,比如使用static可以在头文件中声明变量。如下所示:

test.h#include 
#include 
void fun();static int com;

其他两个文件不做改动,编译、链接和运行都没有报错,输出结果是4. 因为静态变量存储静态存储区,但是静态变量的作用域是一个文件,fun.c, main.c都会为com定义一个本地变量,因此,fun对com的改动不会影响main中的com. 如果希望在fun.c中的改动对main有效果,可以使用extern. 

test.htest.h#include 
#include 
void fun();extern int com;
main.c#include "test.h"int com;int main(){    com = 4;    fun();    printf("%d\n", com);    return 0;}

fun.c 无须改动,此时,程序的输出结果是0。

总结以下:extern变量可以声明一个外部变量,使得编译顺利用过,但是在链接之后才得到实际的变量。每一个文件中定义的静态变量都会在静态存储区中分别分配一个空间,静态全局变量的作用域是该文件。在头文件中一般不会直接定义变量和函数,仅仅作声明。

转载于:https://my.oschina.net/u/2368952/blog/415944

你可能感兴趣的文章
《星辰傀儡线》人物续:“灭世者”、“疯狂者”、“叛逆者”三兄妹
查看>>
安装系统字体
查看>>
Spring的ApplicationContext加载备忘
查看>>
GoogleMapAPIV3.8.6离线包下载
查看>>
SILK 的 Tilt的意思
查看>>
IPC通信:Posix共享内存2
查看>>
GB2312转成UTF-8
查看>>
C#打开chm定位到特定页面
查看>>
[CareerCup][Google Interview] 寻找动态的中位数
查看>>
javascript操作iframe的那些事
查看>>
servlet相关 jar包位置 BAE上部署web应用
查看>>
路徑 z
查看>>
cpu分析简介
查看>>
1.备忘录模式
查看>>
Html学习笔记3
查看>>
杭州见闻
查看>>
What is Xeround?
查看>>
[转载]jQuery上传插件Uploadify使用详解
查看>>
算法学习的轨迹(转)
查看>>
asmx-web-service-basic-authentication
查看>>