C语言中大程序构成————多文件模块

程序文件模块:

当多人合作代码时,每个人所编写的程序会保存在自己的.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;

声明是不产生代码的,但定义是产生代码的。

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值