多文件编程
当代码过多时如果全写在一个.c文件中就会对代码的编写、阅读、调试造成干扰,为了更方便地管理代码,一般都按照功能模块,把代码拆分成多个.c文件,为每个.c文件编写一个.h文件用于说明.c中有哪些函数、全局变量,然后分别编译每个.c文件(gcc -c code.c),会生成目标文件,然后再把多个目标文件合并成一个可执行文件
注意:.c文件最好也包含对应的.h文件,这样可以防止函数的声明与现实不符
// printf("%s %s %d",__FILE__,__FUNCTION__,__LINE__);
// 打印 文件名 , 函数名 , 行号 (固定写法,不用自己定义)
头文件中应该写什么
.h文件可能会被多个不同的.c文件包含,因此.h文件中的内存应该是可以多次被定义的(函数声明,变量声明(extern))
1、函数声明
2、全局变量声明(如果定义全局变量,不要初始化)
3、宏定义(宏常量、宏函数)
4、结构、联合、枚举定义
Makefile脚本
当多个文件编程时,编译会变得异常麻烦,而Makefile文件中可以把编译指令记录下来,当执行make命令时会自动把Makefile中的编译指令进行执行
注意:使用make进行编译时会根据文件的修改时间来确定,.c文件是否需要再次编译,因此在程序运行前最好将之前的编译结果删除后再重新编译,确保安全
Makefile格式:
1、定义一些变量(字符串内容)
CC = gcc/g++ (指定编译器)
STD = -std = gnu99 (指定编译标准)
BIN = a.out (最终编译结果)
OBJ = a.o main.o (目标文件)
FLAG = -Wall -Werror (编译参数)
-Wall:尽可能多的产生警告,以更严格的标准来检查代码
-Werror:把警告当作错误处理
使用时:
$(...) eg. $(CC)
%.o:%.c:将%.o替换成%.c
$< : 表示.c
$@ : 表示.o
2、定义编译目标(函数)
目标名:其它目标(目标依赖,先执行其它目标,再执行此目标)
指令
注意:一定要用tab键缩进,否则会产生错误:*** 遗漏分隔符
注意:默认只执行排在第一个的编译目标
3、用于清理目标文件的编译目标
clean:
rm $(OBJ) $(BIN)
make clean 执行清理
一个可以当成公式的例子:
/***************************************************/
CC = gcc/g++
STD = -std = gnu99
BIN = a.out
OBJ = a.o main.o
FLAG = -Wall -Werror
all:$(OBJ)
$(CC) $(OBJ) -o $(BIN)
%.o:%.c
$(CC) $(STD) $(FLAG) -c $< [-o $@] // 后面若无需重命名,可以不写
clean:
rm $(OBJ) $(BIN)
/***************************************************/