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");
}