C语言复习之:c文件和h文件

C语言复习之:c文件和h文件

在开始讲这个之前,先要弄懂extern这个关键字。

例子1:include 和 extern

这个是一个func.c:

int a=1;

然后这是一个main.c:

#include <stdio.h>
#include "func.c"

int main(int argc, char const *argv[])
{
          
   
	
	printf("a is %d
",a);
	return 0;
}

编译:

gcc main.c -o main

运行:

./main
# 输出:a is 1

include是将整个文件都包含进来,上面的main.c等于是:

#include <stdio.h>
int a=1;

int main(int argc, char const *argv[])
{
          
   
	
	printf("a is %d
",a);
	return 0;
}

下面说extern和include的区别。

例子2:extern 作用

根据中知道gcc编译C语言的过程有编译和链接,在编译阶段:

在main.c中:

#include <stdio.h>

extern int a;

int main(int argc, char const *argv[])
{
          
   
	
	printf("a is %d
",a);
	return 0;
}

这里使用了extern,啥意思呢?就是告诉gcc说,这里我会引用一个其他c文件中的变量,它的数据类型是int。于是我们可以先编译main.c但是不链接:

gcc main.c -c -o main.o

然后我们写一个func.c来实现这个extern int a;:

int a=1;

然后我们可以同样编译但是不链接这个文件:

gcc func.c -c -o func.o

然后进行链接:

gcc main.o func.o -o main

最后验证结果:

./main
# 输出内容:a is 1

所以extern就是告诉编译器说,我这里会引用一个外部文件的变量,至于那个变量具体在哪里,你等到链接的时候再去找,找不到你就直接报错行了。

例子3:extern 和 .h文件

其实.h文件就是可以将我们代码中的一类相关的extern进行汇总:

比如,还是上面的例子,现在我们写一个func.h:

extern int a;

然后我们修改一下main.c:

#include <stdio.h>
#include "func.h"

int main(int argc, char const *argv[])
{
          
   
	
	printf("a is %d
",a);
	return 0;
}

结合最开始的include的例子,我们知道上面的代码和例子2是一样的。

同样的编译过程:

gcc -c -o main.o main.c
gcc -c -o func.o func.c
gcc main.o func.o   -o main

所以.h本质上就是extern。

经验分享 程序员 微信小程序 职场和发展