关键字:extern

1.铺垫

1.1什么是声明?

答:1.告诉编译器,这个名字已经匹配到一块内存上了,如果要使用可以直接使用;在下方的代码中,用到的对应的变量或对象是在别的地方或文件定义的;且同一个声明可以出现多次,编译器不会报错;

2.告诉编译器,这个名字已经预定了,别的地方再也不能用它来作为变量名或对象名。

1.2什么是定义?

答:1.当(编译器)创建一个对象,为这个对象分配一块内存并给它 取上一个名字,这个名字就是我们经常所说的变量名或对象名;但是,一个变量或对象在一定的区 域内(比如函数内,全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义同一个变量或对象

定义声明最重要的区别:定义创建了对象,并在内存上开辟了一块空间,用来存储数据;声明不会在内存上开辟空间

2.关键字extern

extern:作用:是用来进行变量或函数声明的

extern int x;        //带着extern,可以明确的知道是声明;不带extern,不知道是声明还是未初始化的定义

extern void test();        //函数在声明的时候是不带函数体的;建议带上extern,更直观一些

细讲:

在一个程序中,会存在三个文件:test.h(头文件)/test.c(源文件)/main.c(主函数文件),头文件负责声明要用到的变量和函数;源文件负责定义变量和函数(逻辑实现);主函数文件负责逻辑调用

正常情况下,不包含头文件(代表着不声明变量和函数)是可以跨文件调用函数的,但是不能调用全局变量变量

extern修饰变量:告诉编译器,该变量的类型,从而推演需要开辟的内存空间等等;

extern修饰函数:告诉编译器,函数存在,其返回类型和参数类型;

为什么可以跨文件调用函数,而不能跨文件调用变量?

答:此问题涉及进程地址空间和动静态库链接问题请适量理解

不能跨文件调用变量:此报错是编译报错;编译器不认识这个变量,这个变量无属性无类型(不知道是int还是float),空间也无法开辟,编译器就是想接收,其他文件的全局变量,也无法对接;所以编不过去;

可以跨文件调用函数:他也依旧是编译报错,函数在编译后就是指针,4字节大小的地址;在链接的时候,会寻找动静态库,建立链接;若链接不起来,则是链接报错;所以程序可以强制跑下来;

解释带下划线的动静态库:

若已用extern声明变量,静态库的全局变量会在链接阶段整合到最终的可执行文件中,若无extern声明,进程就无法获取该变量;

若已用extern声明变量,动态库的全局变量是在库被加载到进程地址空间时初始化,若无extern声明,进程就无法获取该变量;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值