宏函数、Makefile
复习:
预处理指令:
C代码不能直接被编译器编译,需要一段程序把它翻译成标准C代码,负责翻译的程序叫预处理器,翻译的过程叫做预处理,被翻译的语句叫做预处理指令,以#开头的都是预处理指令
gcc -E code.c 查看预处理结果
gcc -E code.c -ocode.i 把预处理结果保存到.i文件中
1、文件包含
#include 把一个头文件导入到当前文件中
#include <> 从系统指定目录下查找并导入头文件
#include "" 先从当前目录下查找头文件,如果找不到,再从系统指定目录查找并导入头文件
编译参数 -I /路径 来指定头文件的加载路径
系统指定目录是通过设置环境变量来指定 ~/.bashrc
2、宏常量
#define 宏名 字面值数据
如果在代码中使用了宏,在预处理时会把所有的宏替换成宏名后面的字面值数据
优点:提高可扩展性、提高可读性、提高安全性、还可以放在case后面
注意:宏名一般全部大写,末尾不能加分号,不能直接换行(可以使用续行符\)
预定义好的宏:
__func__
__FILE__
__LINE__
__DATE__
__TIME__
3.宏函数
#define FUNC(arg) arg*10
不是真正的函数,其实就是带参数的宏,使用宏函数的位置会被替换成宏函数后面的代码,提供参数会被替换到相应的参数的位置
注意:可以使用续行符和大括号来保护代码
二义性:由于宏所处于的位置或者参数的不同有多种功能,这种叫做宏的二义性,可以在每个参数外加小括号、在最外层加括号,不要使用带自变运算符的参数,降低产生二义性的风险。
运算符:
# 把宏函数的参数变成字符串
## 合并两个参数变成标识符
4.条件编译
根据条件决定哪些代码是否参与编译
#if#elif#else#ifdef#endif
头文件卫士 防止头文件被重复包含
#ifndef FILENAME_H
#define FILENAME_H
#endif//FILENAME_H
版本控制:
#if VERSON >=3
#elif VERSON >=2
#elif CERSON >=1
#else
#endif
编译器控制:
#if _cplusplus
printf("C++编译器\n");
#else
printf("C编译器\n");
#endif;
系统位数判断:
#if _x86_64_
printf("64位操作系统\n");
#elif _i386_
printf("32位操作系统\n");
#endif
5.常见的笔试面试题
定义一个100年有多少秒的宏
#define YEAR_SEC (360024365*100u)
在类型重定义时 #define 和typedef的区别?
在定义常量时 #define与const的区别?
宏函数与函数的区别?
头文件应该写什么:
问题:头文件可能被任何的源文件包含,意味着头文件的内容会在多个目标文件中存在,合并时不能冲突
重点:头文件中只能编写声明语句,不能有定义语句
全局变量声明
函数声明
宏常量
宏函数
typedef 类型重定义
结构、联合、枚举的类型声明
头文件的编写规则:
1、为每一个.c文件写一个.h文件,.h文件是对.c文件的说明
2、如果需要用到某个.c文件的变量、函数、宏,只需要把他的头文件导入即可。
3、.c文件也需要导入自己的.h文件,目的是为了让声明与定义一致
头文件的相互包含:
假如a.h中包含了b.h的内容,而b.h又需要包含a.h中的内容,这种会导致编译出错
解决方案:把a.h中需要的内容,和b.h中需要的内容提取出来,写成一个c.h
错误:位置的类型名‘xxxx’一般都是因为头文件的相互包含导致的,也可能因为复制粘贴时头文件宏名忘记改
Makefile
Makefile是由一些系列编译指令组成的可执行文件,也叫编译脚本
在终端执行make命令会自动执行Makefile脚本中的编译指令,它可以根据文件的最后修改时间,来判断那些文件需要被编译,哪些文件不需要被编译,从而大大地提高编译效率
编译规则:
1、如果该项目没有编译过,则编译全部的.c文件,炳链接成可执行文件
2、如果某些.c文件被修改,则只编译修改过的.c文件,并重新链接新的可执行文件
3、如果某些.h文件被修改,所有依赖他的.c都需要重新编译并链接
一个最简单的Makefile脚本:
执行目标:依赖
编译指令
被依赖的目标1:依赖的文件
编译指令
被依赖的目标2:依赖的文件
编译指令
...
负责清理的执行目标:
rm...
2048游戏:
文件规则:
main.c 程序入口
game2048.c game2048.h 游戏的主要业务逻辑
direction.c direction.h 方向键处理
tools.c tools.h 工具函数
创建文件的脚本:project_create.sh
1、 vim project_create.sh
2、 chmod +x project_create.sh
3、 ./project_create.sh
4、 chmod -x project_create.sh
上一篇: Unity 手机拍照以及相关问题