1. extern 关键字的作用
- 用来声明变量
什么是声明?
声明分为对函数的 声明 和 对变量的 声明
对变量的声明
- extern int m;
对函数的声明
- extern void fun();
- 或
- 直接void fun () ;
声明和定义有什么区别?
- 对于变量来说,有extern 关键字就叫做声明,没有,就叫做定义
- 在定义的同时可以对变量进行赋值,但在声明的同时不可以对变量进行赋值。
- 对于函数来说,有方法体,就是定义,没有方法体,就是声明。
extern 和 全局变量有什么关系?
- 对于有多个 .c 文件的项目来说,如果我们在文件1中定义了一个变量m,想要在文件2,文件3 中引用这个变量m,那只需在文件2,文件3中对这个变量声明一下,就可以使用这个变量。
- 即,我们只需在一个文件中定义一次变量或函数,然后,在其他文件中,只要加上对相应变量或函数的声明,然后就可以直接使用相应的变量和函数了。
- 因为我们在一个文件中定义了一个变量, 在其他文件中都能使用, 这种变量,我们就叫做全局变量。
具体实例:
我们先在module.c 中定义一个变量 m ,定义一个函数fun
#include <stdio.h> int m; void fun() { printf("我被执行了\n"); }
然后,我们在main.c 中调用一下这个m 变量以及fun() 函数,由于变量和函数是定义在 module.c 这个文件中的,所以在调用之前,我们必须要先声明一下。
#include<stdio.h> int main() { //声明变量 extern int m; //声明函数 //void fun(); extern void fun(); //声明过后,就可以使用了。 m=2; printf("%d\n",m); fun(); return 0; }
运行结果:
2
我被执行了
2. 自定义头文件
为什么要定义头文件?
正如上面我们看到的,如果我们想文件2 中使用文件1 中定义的 变量和函数,那么在使用之前,有一个声明的操作。
那既然这个操作是固定的,我们为什么不把这些声明的语句专门放到一个文件中, 以后,要用的时候,直接引入一下这个文件,不就行了?
所以,就有了头文件的存在。比如我们常用的 stdio.h
这个头文件,里面就是对一些变量以及函数的声明。
如何自定义一个头文件?
前面已经说了,头文件中就是对一些变量和函数的声明。
那么我们就来自定义一个头文件试试。
我们还是紧接着前面定义的 main.c 和 module.c 这两个文件写。
定义一个module.h 头文件,然后把main.c 中对变量 m 和函数 fun 的声明放到 module.h 这个头文件中,然后main.c 中就不用再自己对 变量 m 和 函数fun 进行声明,直接引入 module .h 这个头文件就行。
实例:
自定义一个头文件 module.h,里面是对变量 m 以及 函数 fun 的声明
#ifndef _MODULE_H #define _MODULE_H extern int m; extern void fun(); #endif
现在的main .c 的写法:不用再自己对变量m 和函数 fun 进行声明了,直接引入module 这个头文件即可
#include<stdio.h> #include"module.h" int main() { m=2; printf("%d\n",m); fun(); return 0; }
module.c 的写法不变。
运行结果:
2
我被执行了
对#include
的说明
#include
的作用是将头文件中的内容加载进引用他的程序中,
比如#include"module.h"
的作用就是将module.h
中的内容,也就是
extern int m;
extern void fun();
这两句话加载到程序中,这就是为什么我们不用自己对变量和函数进行声明,直接引入头文件就行了。
3. 关于自定义头文件的一些规范
- 当我们需要自定义一些头文件时,在定义完头文件之后,我们最好紧跟着,再定义一个同名的.c 源文件,头文件中用来对变量和函数进行声明,.c 源文件中用来定义相应的变量和函数。
比如,上面,我定义了一个module.h 的头文件,里面对 变量m 和函数fun 进行了声明,然后,我们再定义一个module.c源文件,用来对相应的变量和方法进行定义。
代码:
nodule.h
#ifndef _MODULE_H #define _MODULE_H extern int m; extern void fun(); #endif
module.c
#include <stdio.h> int m; void fun() { printf("我被执行了\n"); }