预处理
一.总体概述
预处理本质是将我们的代码进行预先处理。主要分为四个步骤:1.去注释; 2.宏替换; 3.条件编译; 4.头文件展开(以下主要说明去注释和宏替换部分,条件编译在第三点,文件展开在第四点)
1.注释去除
2.宏替换
举个例子
具体的预处理
二.宏定义
1.数值宏常量
2.字符串宏常量
3.用宏定义注释符号
结论:预处理阶段先去注释,后进行宏替换
上面我们用的是c++风格的注释,那么我们换成c风格的注释,结果会不会不同呢?
预处理之后
结论:无论是哪种风格的注释,都是先去注释再进行宏替换
4.用宏定义表达式(难点)
1.第一种情况
我们也可以来看看它预处理后的结果
2.第二种情况
有什么问题
结论:用宏来充当多条语句的时候,在一些较为复杂的场景中可能并不能达到我们想要的结果
怎样修改
这种结构被称为do—while—zero结构
5.#undef(宏的有效范围)
1.两个问题
下面是第一个问题的探索
得出结论:宏可以在任何地方定义,与在函数体内还是函数体外都没有任何关系
下面是第二个问题的探索
得出结论:宏从定义处向下都是有效的,与函数调用无关(因为宏替换在函数调用之前),只是简单的文本替换
2.#undef的使用
结论:#undef又可以称为限制宏,在宏定义的下面,#undef的上面才是宏的有效范围
3.一段代码的理解
三.条件编译
1.#ifdef和#ifndef的用法
举个例子
接下来加上一起用
2.#if的用法
多条件判断
上述的所有代码均可在VS里实现并且没有差别。
3.如何用#if来取代#ifdef
结论
1.#ifdef等价于#if defined()
2.#ifndef等价于#if !defined()
3.不管是哪一种写法必须以#endif 结尾
4 .裁剪的意义
举个例子
5.深入理解奇怪的情况
第一种:同时检测两个定义
嵌套情况
多条件检测宏定义
四.头文件展开
1.一种现象
第一次包含时,我们的TEST_H_没有被定义,那么它下面的就会被保留。
当我们第二次,第三次想要包含该文件时,由于_TEST_H_已经被定义,那么它之下的就不会被保留,从而做到避免被重复包含。
2.什么叫做头文件展开
结论:头文件展开就是把头文件内容拷贝到目标源文件(当然这种拷贝是进行过优化的)
四.一些好玩的预处理符号
1.预处理符号
#error
#line
#pragma
2.#运算符
这种特性被叫做:相邻字符串具有连接特性
一个例子
结论是:在宏中直接使用单井号是将参数符号s对应的文本内容转义成字符串
一个应用