1.预处理规则
文件包含
宏定义
条件编译
2.预处理器的主要工作:
1、文件包含
2、宏定义替换
3、取舍条件编译
3.预处理通用规则
指令都以#开始
在指令的符号间可有任意数量的空格或tab
通常指令在第一个换行符处结束,末尾不出现‘;’
指令可出现在程序任何地方,但通常#define,#include指令出现在文件开始
注释与指令可出现在同一行
宏名一般都以大写字母表示
4.预处理器的作用:
预处理器相当于编辑工具,通过处理’#’开头的预处理指示,重新编辑C的源文件,过滤掉对人类有用的信息,留下对机器有用的信息,保留原始的字节流, 使代码更精练,编译、执行效率更高。
注释—对程序阅读者有用,对机器无用,预处理时会把注释去掉,还有:空行,空格,缩进。
经过预处理后把源代码还原成原始的字节流,这种字节流对机器来讲处理起来比较快。
5.宏定义只进行简单替换(预处理器只进行编辑处理),不进行正确性检查(编译器才进行语法检查)
6.变量式宏定义
语法:#define 宏名替换列表
在代码中所有的宏名都会被替换为替换列表中的内容 不要在宏定义末尾添加’;’
7.变量式宏定义的好处:
1、程序更易读
2、程序更易修改
3、控制条件编译
8.宏定义的作用域:
从宏定义的地方开始到文件结束,和全局变量的作用域类似,但全局变量可以通过extern关键字在其他模块中声明来将全局变量导出到其他的文件中,而宏定 义不可以。
9.取消宏定义:#undef
10.函数式宏定义
函数式(带参数)宏定义
语法:#define 宏名(x1,x2,…,xn) 替换列表
参数x1、x2…xn可以在替换列表中出现多次
在带参数的宏定义当中一定要毫不吝啬地加(),来人为地控制优先级和接合性
11.宏定义中的续行符?\?
通常#开头的指令只占一行,若指令较长可使用’\’进行续行,要求’\’后紧跟换行符
12.带参数的宏和函数的区别:
1、宏是预处理的概念,而函数是程序执行时的概念
2、宏不会检查参数,函数会检查参数
3、宏不允许递归,函数可以递归
4、宏可能会对参数进行多次计算
13.带参数的宏和函数的优缺点:
1、宏不会检查参数,函数会检查参数
2、带参数的宏执行时稍微快些,不需要像函数似地进行参数压栈、保护上下文等操作
3、宏相比较于函数在空间上会浪费
宏以空间换时间,但不进行参数检查往往导致严重的问题。
14.内联函数:inline
内联函数是函数不是宏
集合了函数及宏的优点,既进行参数检查又提高了运行速度(不需要进行参数压栈、保护上下文)。宏不会检查参数,函数会检查参数
通常代码实现简短的函数会被定义为内联函数:
1、没有递归
2、没有循环及复杂的条件分支
3、代码比较少
15.文件包含的作用
通常工程文件都由若干个文件组成,文件间信息共享(函数的相互调用、外部变量、宏定义、类型定义的共享)需要通过#include 头文件实现。
16.<>:在默认路径下搜索头文件/usr/include/
:用户指定的路径下搜索&#xff1a;
1、表示当前路径
2、表示用户指定路径
17.头文件可以包含&#xff1a;
函数的声明
全局变量的声明
宏定义
类型的定义
嵌套包含头文件
18.条件编译&#xff1a;根据预处理器所执行的测试结果来包含或排除程序的片段。#if , #endif, #ifdef, #ifndef, #elif, #else 运算符&#xff1a;defined
运算符defined&#xff1a;应用于标识符时&#xff0c;测试某个宏是否被定义过&#xff0c;定义过返回1&#xff0c;否则返回0&#xff0c;defined通常与#if指令结合使用&#xff0c;
19.条件编译的三种基本形式&#xff1a;
1&#xff1a;#if 常量表达式
code...
#endif
2.#ifdef DEBUG
code...
#endif
3.#ifndef DEBUG
code...
#endif