一、多文件编程
1、多文件编程步骤
①把所有函数分解在不同的源文件里,主函数要是单独的文件
②为每个源文件编写以.h作为拓展名的头文件,主函数不需要头文件,只要是不分配内存的内容都可以写在头文件里,至少要包含配对源文件所有函数的声明语句
③在所有源文件里使用#include指令包含必要的头文件,配对头文件都是必要的头文件
④为了防止多个函数包含同样的头文件造成重复编译,需要为头文件加上头文件卫士(#ifndef.....#define.....#endif),意思是如果定义了该宏,就不在重复定义,保证了头文件只被编译一次,也就是条件编译
例如:
//此为add.c文件
#include"add.h"
int add(int val,int val1){
return val+val1;
}
//此为add.h文件
#ifndef _ADD_H
#define _ADD_H
#include<stdio.h>
int add(int,int);//函数声明
#endif
//此为main.c文件
#include"add.h"
int main(void){
printf("%d\n",add(5,8));
return 0;
}
2、gcc的编译过程(从.c源码到可执行文件)
用图来说明一下,基本通过这几步得到一个可执行文件
gcc的其他选项
-o ,认为给定输出的可执行文件名,如果不给出这个选项,gcc就给出预设的可执行文件a.out。
-g,产生符号调试工具(GNU的gdb),要想对源代码进行调试,我们就必须加入这个选项。
-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化 处理,这样产生的可执行文件的执行效率可以提高, 但是,编译、连接的速度就相应地 要慢一些。
-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。
-D ,可以在后面定义宏名
3、条件编译
从几组语句中选择一组进行编译
#ifdef.....#else.....#endif //如果定义了宏,则编译ifdef下语句,否则执行else下语句
#ifndef.....#else......#endif //与上述效果相反
#if.........#elif(任意多次)......#else........#endif //可以根据宏的定义从多组语句中选择一组编译,#if //和#elif后写逻辑表达式,可以包括任意逻辑操作符
例如:
#include<stdio.h>
int main(void){
#ifdef HP
printf("ok\n");
#else
printf("error\n");
#endif
return 0;
}
//直接运行时结果会打印error
//如果编译时 gcc -D HP去定义这个宏,运行结果会打印ok
//如果把#ifdef换成#ifndef,那么结果会反过来
#include<stdio.h>
int main(void){
#if defined(HP)//如果定义了布尔值会为1
printf("1\n");
#elif !defined(WJ)
printf("2\n");
#else
printf("3\n");
#endif
return 0;
}
//定义了哪个宏就会输出哪个
4、Makefile的使用
1.Make是自动编译管理器,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少
编译的工作量,同时,它通过读入Makefile来执行大量的编译工作
2.make工具的作用
当项目中包含多个c文件,但只对其中1个文件进行了修改,gcc编译会将所有的文件从头编译一 遍,这样效率会非常低,所以通过make工具,只对修改过的文件进行编译,这样大大减少了编 译时间,提高编译效率