简单的说,每一个.c或者.cc都是一个编译单元,每一个编译单元编辑的结果是一个.o或者obj之类的中间文件,至于是否是多文件,不需要关心,但是要保证不同的编译单元之间不要有重复的符号,这就是要避免重复包含了,每一个编译单元生成的目标文件.o或者obj都会引用一些不在本目标文件中的符号,这些符号定义在别的.o或者.obj文件中, 链接器把他们联系在一起,所有的符号也就都有定义了,编译链接简单说来就是这样。
多文件排序?
写错。不好意思啊
@飞天狐: 网上找到的资料:
条件:设有一个PROJECT,包含四个文件:main.c 、 func0.c 、 func1.c 、 incfunc.h;其中func0.c包含函数f_a()和f_b();其中func1.c包含函数f_c()和f_d(),四个函数均为整型。
其中main.c是主文件,func0.c和func1.c是包含main.c中用到的函数的两个C文件,incfunc.h是头文件。
编译前需要在main.c 、func0.c和func1.c文件中包含inc_func.h,也就是加入:#include "array.h" 语句;
inc_func.h文件内容如下(其实就是在inc_func.h文件中声明函数头;函数体在具体的func0.c和func1.c文件中进行定义):
// 开始
#define INCFUNC_H
int f_a();
int f_b();
int f_c();
int f_d();
//结束
其他部分与编译一个文件一样。
简单概括就是,所有需要参加编译的C文件都需要包含相应的H文件;H文件要定义C文件中函数的“函数头”。一般来说,主文件包含多个H文件,其他的C文件包含相应的H文件。以上面的例子来说,可以用func0.h和func1.h来分别定义f_a()、f_b()和f_c()、f_d()的函数头,而 func0.c和func1.c 只须分别包含两个H文件,main.c需要同时包含两个H文件。
需要注意的是平时常用的类型所写,如:
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
只须在主文件main.c中定义即可,重复定义会在编译时产生很多warning。
@artwl: 在迷茫中看到一点星光,但仍然朦胧,谢谢咯!