幻想编程

C语言多文件编译的例子

时间:14-08-23 00:08:50点击:4626

在 VC6.0 中新建一个工程,添加 fun.c、main.c 两个源文件和 fun.h 一个头文件,内容如下:

fun.c

复制纯文本新窗口

#include <stdio.h>

int fun1(){

printf("The first function!\n");

return 0;

}

int fun2(){

printf("The second function!\n");

return 0;

}

int fun3(){

printf("The third function!\n");

return 0;

}

#include <stdio.h>

int fun1(){

printf("The first function!\n");

return 0;

}

int fun2(){

printf("The second function!\n");

return 0;

}

int fun3(){

printf("The third function!\n");

return 0;

}

fun.h

复制纯文本新窗口

#ifndef _FUN_H

#define _FUN_H

extern int fun1(void);

extern int fun2(void);

extern int fun3(void);

#endif

#ifndef _FUN_H

#define _FUN_H

extern int fun1(void);

extern int fun2(void);

extern int fun3(void);

#endif

main.c

复制纯文本新窗口

#include <stdio.h>

#include <stdlib.h>

#include "fun.h"

int main(){

fun1();

fun2();

fun3();

system("pause");

return 0;

}

#include <stdio.h>

#include <stdlib.h>

#include "fun.h"

int main(){

fun1();

fun2();

fun3();

system("pause");

return 0;

}

对上面的每个 .c 文件都进行编译,然后链接并运行:

The first function!

The second function!

The third function!

上面的例子,函数定义放在 fun.c 文件中,在 fun.h 头文件中对函数进行声明,暴露接口,然后在主文件 main.c 中引入 fun.h。

注意:编译是针对单个 .c 文件的,如果项目中有多个 .c 文件,需要逐一编译,然后链接,或者使用 组建 -> 全部重建 选项,一次性编译并链接所有文件。

多文件编程时,只能有一个文件包含 main() 函数,因为一个工程只能有一个入口函数。我们把包含 main() 函数的文件称为主文件。

可以在其他 .c 文件中对函数进行定义,在 .h 中对函数进行声明,只要主文件包含进相应的头文件,就能使用这些函数。实际开发中,很少有简单到只有几十行代码的C语言项目,合理的组织代码和文件,是开发大中型项目的必备技能。

为了更好的组织各个文件,一般情况下一个 .c 文件对应一个 .h 文件,并且文件名要相同,例如 fun.c 和 fun.h。如果 fun.c 使用到了 fun.h 的宏定义、类型定义等,还需要在 fun.c 中 #include "fun.c"。

.c 文件主要包含各个函数的定义,.h 文件声明函数原型,向外暴露接口,供主文件调用。另外也可以在 .h 中包含宏定义、类型定义。

注意:.h 文件头文件中不能有可执行代码,也不能有变量定义,只能有宏、类型( typedef,struct,union,menu )定义和变量、函数的声明。

这倒不是说在 .h 中定义变量或函数会有语法错误,实际上#icnlude机制很简单,就是把#include所包含的文件中的内容直接复制到#include所在的位置并替换#include语句。但是这样做不符合模块化编程的惯例,也不利于文件的组织,不利于二次开发,不利于团队协作。

头文件要遵守幂等性原则,即可以多次包含相同的头文件,但效果与只包含一次相同。

可以使用下面的宏防止一个头文件被重复包含。

复制纯文本新窗口

#ifndef MY_INCLUDE_H

#define MY_INCLUDE_H

//头文件内容

#endif

#ifndef MY_INCLUDE_H

#define MY_INCLUDE_H

//头文件内容

#endif

如果该头文件已被包含,那么会定义宏 MY_INCLUDE_H,再次包含时,就不会对头文件内容进行编译了。