程序文件模块:
当多人合作代码时,每个人所编写的程序会保存在自己的.c文件中。这样一个大程序会由几个文件组成,每个文件又可能包含若干个函数。C语言把保存有一部分程序的文件称为程序文件模块。当大程序分成若干个函数。可以对各文件模块分别编译,然后通过连接,把编译好的文件模块连接再合起来,生成可执行程序。
包含.c文件与.h文件:
1.包含.c文件
直接将代码写在.c文件中,其他文件要调用函数则直接包含.c文件。正如下面一段代码:
//fun.c
int h = 0;
int cal(int a, int b)
{
return (2*a+3*b);
}
//main.c
#include "stdio.h"
#include "fun.c" //包含.c文件
int main(void)
{
h = 1; //直接使用fun.c中的变量
int i = 1,j = 2;
int c = 0;
c = cal(i, j); //直接调用fun.c中的函数
printf("%d\n", c);
return 0;
}
此程序运行是没有问题的。
但如果加上:
//fun.c
int h = 0;
int cal(int a, int b)
{
return (2*a+3*b);
}
//min.c
#include "fun.c" //包含 fun.c
//main.c
#include "stdio.h"
#include "fun.c" //包含.c文件
#include "min.c"
int main(void)
{
h = 1; //直接使用fun.c中的变量
int i = 1,j = 2;
int c = 0;
c = cal(i, j); //直接调用fun.c中的函数
printf("%d\n", c);
return 0;
}
程序便会运行错误,会显示出现重复声明,而再c语言中,一个变量是不可以被重复声明的。这是直接引入.c文件很容易犯的错误。
2.包含.h文件
我们建立一个.h文件。里面包含:函数的声明,全局变量的声明(extern),全局结构体的定义,全局结构体变量的声明。(值得注意的是结构体不能声明为外部变量,只能是包含的头文件中定义的结构体。)
调用文件(main.c)文件中:包含.h头文件即可。不用声明任何东西。
//fun.c
int h = 0;
int cal(int a, int b)
{
return (2*a+3*b);
}
//min.h
int cal (int a,int b)
extern int h; //外部变量声明
//main.c
#include "stdio.h"
#include "min.h" //包含.h文件
int main(void)
{
h = 1; //直接使用fun.c中的变量
int i = 1,j = 2;
int c = 0;
c = cal(i, j); //直接调用fun.c中的函数
printf("%d\n", c);
return 0;
}
函数,全局变量,结构体,结构体变量都能在外部调用;每一处调用变量的文件处不用重复的写声明语句,因为声明语句直接写在了.h头文件中,直接包含头文件即可。
解决文件重复包含造成的重定义问题:
利用标准头文件和宏定义:
//min.h
#ifndef _MIN_H_
#define _MIN_H_
int cal (int a,int b)
extern int h; //外部变量声明
#endif
#include
- 和宏一样是编译预处理指令,在编译之前就处理了
- 把文件的全部文本内容原封不动地插入到它所在的地方
定义和声明
函数定义
int max(int a,int b){undefined
}
函数原型声明
int max(int a,int b);
变量定义
int i;
变量声明
extrern int i;
声明是不产生代码的,但定义是产生代码的。