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。
