C 多文件编程

多文件编程

  • 1. 概念
    • 把程序内容分散在多个源文件里
  • 2. 基本规则
    • 一个文件里可以包含多个函数
    • 一个函数只能属于一个文件
  • 3. 改造步骤
    • 1. 把程序的函数分别写在多个不同的源文件里(主函数通常单独占一个文件)
    • 2. 为每个源文件编写配对头文件(以 .h 做扩展名),头文件至少要包含源文件所有函数的声明,理论上所有不分配内存的内容都可以写进头文件,(只包含主函数的源文件不需要配对头文件
    • 3. 在每个源文件里包含必要的头文件,必要头文件分2种
      • 1.源文件所配对的的头文件。 #include "****.h"
      • 2.如果一个源文件里使用了某个头文件里声明的函数,那这个头文件也是这个源文件的必要头文件
  • 4. 编译方法
    • 在gcc命令后列出所有源文件的路径
    • 使用Makefile文件记录整个编译过程
//mutil_main.c
#include <stdio.h>
#include "multi_read_1.h" //因为主函数用到了"multi_read_1.h"里声明的read函数
int main() {
    int val = 0;
    val = read();
    printf("%d\n", val);
    return 0;
}

//multi_read_1.h
#ifndef __MULTI_READ_1_H__
#define __MULTI_READ_1_H__
int read(void);
#endif    //__MULTI_READ_1_H__ (这个注释表示 #endif 是和第一行的 #ifndef 配对的)

//1. 应该在头文件内容的前后使用预处理指令,这样做的目的,如果一个源文件的多次包含了这个头文件的内容,那么再编译这个源文件的时候,也只会把这个头文件编译一次
//2. 如果不加这些预处理指令,可能会把头文件编译很多次
//3. 另外为了避免不同的头文件使用同样的宏名称,规定,每个头文件使用的宏名称必须要和它的文件名对应

//第一个预处理指令必须是 #ifndef  

//multi_read_1.c
#include <stdio.h>
#include "multi_read_1.h"

int read(void) {
    int val = 0;
    printf("请输入一个整数: ");
    scanf("%d", &val);
    return val;
}

/*
两种编译方式:
1.	gcc mutil_main.c multi_read_1.c
2.	make //需要写 Makefile
*/

  • Makefile:
# 2. 最后把所有的 .o 目标文件合并成 a.out 可执行文件
a.out : multi_read_1.o multi_main_1.o
	gcc multi_read_1.o multi_main_1.o
	
# 1. 为每个源文件单独写一个编译过程

#下面表示可以根据 multi_read_1.c 源文件编译得到叫 multi_read_1.o 的目标文件
#Tab键开头加 gcc -c 就可以编译一个不完整的程序

multi_read_1.o : multi_read_1.c
	gcc -c multi_read_1.c

multi_main_1.o : multi_main_1.c
	gcc -c multi_main_1.c

##真正的 Makefile 文件每一步都是可扩展的,上面的只是最简单的一个例子
  • 5. 注意事项
    • 只要是不分配内存的内容都可以写在头文件里
    • 头文件内容应该包含在条件编译预处理指令中间
    • 头文件里使用宏名称应该根据头文件名称变化得到
    • 为了从一个源文件里使用另外一个源文件里声明的非静态全局变量,就需要在这个源文件里使用 extern关键字再次声明那个全局变量(不可以从一个源文件里使用另一个源文件里的声明的静态全局变量,因为静态全局变量的作用域是当前文件的所有语句)
    • 使用extern关键字声明的语句常常放在头文件里
//mutil_main.c
#include <stdio.h>
#include "multi_read_1.h"

//使用extern关键字把另一个源文件里的全局变量再次声明一下
// extern int val;
int main() {
    read();
    printf("%d\n", val);
    return 0;
}

/*
使用extern声明全局变量是不会分配内存的,所以通常会把它放在头文件里。
这样做的好处就是,任何一个源文件如果想使用这个全局变量的话,只用包含这个头文件就可以了
*/


//multi_read_1.h
#ifndef __MULTI_READ_1_H__
#define __MULTI_READ_1_H__
extern int val;
void read(void);
#endif    //__MULTI_READ_1_H__ 


//multi_read_1.c
#include <stdio.h>
#include "multi_read_1.h"
//声明一个全局变量
//写成 static int val; 就会报错,因为静态全局变量的作用域是当前文件的所有语句
int val;
//read 函数不再使用返回值向调用函数传递数据
void read(void) {
    printf("请输入一个整数: ");
    scanf("%d", &val);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值