extern关键字
extern关键字的用法很简单,就是简简单单的声明,它可以明确的指出一个语句是声明;
比如extern int i;那么就说明 这是声明变量 i,而不是定义i,声明是不开辟内存的,定义是开辟内存的。
假如int i;没有extern修饰,那就说明为定义,会分配内存空间的。
extern 的使用场景1
extern 可以声明一个变量,使得该变量是来自其他文件的变量在本文件可以被访问。
比如:创建两个文件 test.c 和 main.c文件;
在test.c文件中定义一个全局变量:在main.c文件,声明变量 i;
//test.c
int i = 20; //定义一个全局变量
main.c文件
# include<stdio.h>
extern int i; //声明变量i,当编译链接时候,main.c文件就可以访问到test.c文件的i的值了;
int main()
{printf("%d",i);return 0;
}
这样我们就可以跨文件(test.c),在本文件(main.c)访问这个变量了;
extern 的使用场景2
# include<stdio.h>
# include"test.h"
//extern int i; 不用写了
//extern int j;不用写了
//extern int k;不用写了
//...
//声明很多很多变量,都不用写了,因为包含了头文件,声明都在头文件中
int main()
{printf("%d %d %d",i,j,k);return 0;
}
但是上诉的使用方式并不好,假如我一个大工程,这个工程由超级多的文件,这些文件假如都要访问
test.c文件的 变量 i,那么,只能在这些文件中,每个文件的开头都 声明变量 i,并且,假如我的test.c,不止一个定义一个变量i,有好多其他变量呢?在其他文件访问时候,都要声明好多变量,这会使得书写难度很繁琐,并且维护成本也大;
所以一般,我们都把声明语句放到头文件使用,即我定义一个test.h的头文件;
在该头文件中,声明 extern int i;
然后,假如你在其他文件要使用改变量i,直接包含该头文件即可,
比如:test.h 头文件
//test.h 头文件
extern int i;
extern int j;
extern int k;
//...
//声明很多很多变量
在其他.c文件,只要包含该头文件,就可以啦,比如在main.c
文件:
extern的用法总结
extern一般用于声明,在.h文件中,声明变量或者函数(函数可以不加extern,但是最好加上,这样比较统一);在其他文件要访问该变量函数时候,包含头文件就行哦。
声明和定义的区别
声明是用来告诉编译器变量的名称和类型,而不分配内存。
extern int var; // 声明extern int ble =10; // 定义typedef int INT; // 声明struct Node; // 声明
即使是 extern ,如果给变量赋值了,就是定义了。
上面代码中,语句 extern int var;表示 var 在别的文件中已经定义,提示编译器遇到此变量时在其它模块中寻找其定义。语句 extern int ble = 10;表示定义了变量 ble,这一点需要注意。
定义是为了给变量分配内存,可以为变量赋初值。
通常变量的定义和声明是同时发生的,注意:extern 变量类型 变量名 仅是声明。
函数声明
函数的声明是通知编译器函数名称、参数数量和类型以及函数返回类型,例如:
int Max(int x, int y);
函数定义
函数的定义是为函数分配内存,例如:
int Max(int x, int y) {return x > y ? x : y;}
函数只要有实现(存在函数体 { …… } )即为定义,否则为声明。可以这样理解:函数声明是说明函数是什么,函数定义是说明函数做什么。
声明/定义次数
变量/函数可以声明多次,变量/函数的定义只能一次。
分配内存
声明不会分配内存,定义会分配内存。
做了什么
声明是告诉编译器变量或函数的类型和名称等,定义是告诉编译器变量的值,函数具体干什么。