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