前言
一个软件项目往往包含多个源码文件,编译时需要将这些文件一起编译,生成一个可执行文件。
假定一个项目有两个源码文件foo.c和bar.c,其中foo.c是主文件,bar.c是库文件。
所谓“主文件”,就是包含了main()函数的项目入口文件,里面会引用库文件定义的各种函数:
// File foo.c
#include <stdio.h>
int main(void) {
printf("%d\n", add(2, 3)); // 5!
}
上面代码中,主文件foo.c调用了函数add(),这个函数是在库文件bar.c里面定义的:
// File bar.c
int add(int x, int y) {
return x + y;
}
现在,将这两个文件一起编译:
gcc -o foo foo.c bar.c
# 更省事的写法
gcc -o foo *.c
上面命令中,gcc 的-o参数指定生成的二进制可执行文件的文件名,本例是foo。
这个命令运行后,编译器会发出警告,原因是在编译foo.c的过程中,编译器发现一个不认识的函数add(),foo.c里面没有这个函数的原型或者定义。
因此,最好修改一下foo.c,在文件头部加入add()的原型:
// File foo.c
#include <stdio.h>
int add(int, int);
int main(void) {
printf("%d\n", add(2, 3)); // 5!
}
现在再编译就没有警告了。
你可能马上就会想到,如果有多个文件都使用这个函数add(),那么每个文件都需要加入函数原型。
一旦需要修改函数add()(比如改变参数的数量),就会非常麻烦,需要每个文件逐一改动。
所以,通常的做法是新建一个专门的头文件bar.h,放置所有在bar.c里面定义的函数的原型:
// File bar.h
int add(int, int);
然后使用include命令,在用到这个函数的源码文件里面加载这个头文件bar.h:
// File foo.c
#include <stdio.h>
#include "bar.h"
int main(void) {
printf("%d\n", add(2, 3)); // 5!
}
该实验为 VIP 专享内容,
请开通后继续阅读后续 70% 并运行完整示例~
请开通后继续阅读后续 70% 并运行完整示例~
DISCUSSION
评论 0
还没有评论,来留下第一条吧。