0
点赞
收藏
分享

微信扫一扫

详细解析预处理

蓝莲听雨 2022-12-19 阅读 144

预处理

在这里插入图片描述

一.总体概述

预处理本质是将我们的代码进行预先处理。主要分为四个步骤: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对应的文本内容转义成字符串

在这里插入图片描述

一个应用

在这里插入图片描述

在这里插入图片描述

举报

相关推荐

0 条评论