预处理机制

跟着肯哥(不是我)学预处理机制

预处理类别

宏定义:#define

  • 将文本替换为表达式或语句

条件编译:#ifdef#ifndef#if#elif#endif

  • 根据标识符是否被定义选择编译代码

头文件包含:#include

  • 将其他文件(通常是头文件)包含到当前文件中,以便在当前文件中使用头文件中定义的内容

预处理流程

  1. 预处理指令识别
  2. 宏替换
  3. 条件编译
  4. 头文件包含
  5. 行连接处理
  6. 宏展开和条件编译的递归处理

预处理指令识别

扫描源代码并识别以#开头的预处理指令。

宏替换

预处理器根据宏定义将代码中的宏名称替换为指定的文本。
可以是常量替换,也可以是带参数的宏函数替换
预处理器会根据宏定义展开宏

条件编译

根据条件选择性地编译不同的代码块。
#ifdef#ifndef#if#elif#endif

头文件包含

通过#include指令,将其他文件(通常是头文件)包含到当前文件中,以便在当前文件中使用头文件中定义的内容

预处理的行连接处理

在C语言中,行连接处理是预处理阶段的一部分,用于将一行代码书写为多行,以保持代码可读性。
行连接操作通过反斜杠\字符实现。一行代码以反斜杠字符结尾时,该行代码将与下一行自动连接为一行。
image.png
换行之后的进位也会被当作空格输出出来。
行连接在预处理阶段,在编译阶段看到代码时,已经是连接在一起的一行。这种处理不会影响编译器的语义分析和中间代码。

宏展开和条件编译的递归处理

在进行宏展开和条件编译时,如果遇到新的预处理指令,预处理器会递归地处理这些指令。肯呢个会触发更多的宏展开和条件编译。

删除注释

预处理器将源代码中的注释删除,注释在预处理阶段无需保留,不会影响编译器的输出。

预编译的警告信息和错误信息

可以使用#error#warning预处理指令来生成编译错误和警告信息。这些指令在预处理时发出特定的错误或警告信息,让开发者知道代码中存在的问题或需要注意的地方
image.png
#error#warning指令生成的信息只会在预处理阶段发出,而不会影响到最终的目标代码,它们在编译阶段不会生成任何错误或警告信息。
image.png

查看预处理后的源文件

以肯哥用的GCC为例。
可以使用-E选项来查看预处理后的源文件。只进行预处理操作,不进行编译、汇编和链接。将预处理后的源文件输出到标准输出流,一般是控制台。
gcc -E example.c
编译器会将预处理后的内容输出到控制台。
如果你想将预处理后的源文件保存到一个文件中,可以使用重定向操作符>将输出重定向到一个文件中。
gcc -E example.c > preprocessed.c
上述命令会将预处理后的源文件保存到名为preprocessed.c的文件中。

重点强调

  • 宏定义的命名规范
  • 宏定义与函数调用的冲突
  • #include不单单是只能包含头文件:include的本质就是纯文本包含。
  • 善用条件编译:在庞大工程代码的配置裁剪工作中,绝大多数的技术手段就是利用条件编译,对不同的代码选用和删除,达到代码裁剪的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/182877.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

万界星空科技商业开源MES/免费MES/低代码MES

万界星空科技商业开源MES可以提供包括制造数据管理、计划排程管理、生产调度管理、库存管理、质量管理、人力资源管理、工作中心/设备管理、工具工装管理、采购管理、成本管理、项目看板管理、生产过程控制、底层数据集成分析、上层数据集成分解等管理模块,打造一个…

Python+jieba+wordcloud实现文本分词、词频统计、条形图绘制及不同主题的词云图绘制

目录 序言:第三方库及所需材料函数模块介绍分词词频统计条形图绘制词云绘制主函数 效果预览全部代码 序言:第三方库及所需材料 编程语言:Python3.9。 编程环境:Anaconda3,Spyder5。 使用到的主要第三方库:…

gitee推荐-PHP面试准备的资料

该内容为giee项目。PHP-Interview: 这个项目是自己准备PHP面试整理的资料。包括PHP、MySQL、Linux、计算机网络等资料。方便自己以后查阅,会不定期更新,欢迎提交pr,如果错误,请指出,谢谢 在线预览地址:Intr…

【LeetCode】每日一题 2023_11_23 HTML 实体解析器(调库/打工)

文章目录 刷题前唠嗑题目:HTML 实体解析器题目描述代码与解题思路 结语 刷题前唠嗑 题目:HTML 实体解析器 题目链接:1410. HTML 实体解析器 题目描述 代码与解题思路 func entityParser(s string) (ans string) {return strings.NewRepla…

OpenHarmony之NAPI框架介绍

张志成 诚迈科技高级技术专家 NAPI是什么 NAPI的概念源自Nodejs,为了实现javascript脚本与C库之间的相互调用,Nodejs对V8引擎的api做了一层封装,称为NAPI。可以在Nodejs官网(https://nodejs.org/dist/latest-v20.x/docs/api/n-api…

C语言——从键盘输人三角形的三个边长 a、b、c,求出三角形的面积。

从键盘输人三角形的三个边长 a、b、c,求出三角形的面积。求三角形的面积用公式areasqrt(s*(s-a)*(s-b)*(s-c)),其中 s1/2(a十bc)。注:要求对输人三角形的三个边长做出有效性判断。 #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> #include<math.h> int main…

System-V共享内存和基于管道通信实现的进程池

文章目录 一.进程间通信:进程间通信的本质: 二.Linux管道通信匿名管道:关于管道通信的要点:基于匿名管道构建进程池: 三.System-V共享内存共享内存和命名管道协同通信 参考Linux内核源码版本------linux-2.4.3 一.进程间通信: 操作系统中,为了保证安全性,进程之间具有严格的独…

<JavaEE> 什么是线程(Thread)?进程和线程有什么区别?

目录 一、线程&#xff08;Thread&#xff09;的概念 二、线程存在的意义 2.1 并发编程 2.2 比进程更“轻量” 三、使用线程时应该注意 四、进程和线程的区别 五、Java中的线程和操作系统中的线程是不同的概念 六、多线程编程 一、线程&#xff08;Thread&#xff09;的…

Web服务器(go net/http) 处理Get、Post请求

大家好 我是寸铁&#x1f44a; 总结了一篇Go Web服务器(go net/http) 处理Get、Post请求的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 go http请求如何编写简单的函数去拿到前端的请求(Get和Post) 服务器(后端)接收到请求后&#xff0c;又是怎么处理请求&#xff0c…

gitlab各版本安装注意点:

研发团队在安装gitlab各版本过程中可能遇到各种问题&#xff0c;为了后续容易查看特将我们在实践过程中遇到的各类问题要点总结如下&#xff1a; gitlab 10.8.3 (564c342&#xff09;安装 centos Linux yum安装网址查找网址&#xff1a;gitlab/gitlab-ce - Results for gitla…

【赠书第7期】从零基础到精通Flutter开发

文章目录 前言 1 安装Flutter和Dart 2 了解Flutter的基础概念 2.1 Widget 2.2 MaterialApp和Scaffold 2.3 Hot Reload 3 编写你的第一个Flutter应用 3.1 创建一个Flutter项目 3.2 修改默认页面 3.3 添加交互 4 深入学习Flutter高级特性 4.1 路由和导航 4.2 状态管…

RubyMine 2023:提升Rails/Ruby开发效率的强大利器

在Rails/Ruby开发领域&#xff0c;JetBrains RubyMine一直以其强大的功能和优秀的性能而备受开发者的青睐。现如今&#xff0c;我们迎来了全新的RubyMine 2023版本&#xff0c;它将为开发者们带来更高效的开发体验和无可比拟的工具支持。 首先&#xff0c;RubyMine 2023提供了…

C/C++小写字母的判断 2022年3月电子学会中小学生软件编程(C/C++)等级考试一级真题答案解析

目录 C/C小写字母的判断 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C小写字母的判断 2022年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 输入一个字符&#xff0c;判断是否是英文小…

在两个java项目中实现Redis的发布订阅模式

如何在两个java项目中实现Redis的发布订阅模式&#xff1f; 1. Redis简介2. 发布订阅模式介绍3. 实现思路4. 代码实现及详细解释4.1. RedisUtil4.2. Publisher4.3. Subscriber4.4. 运行程序 目录&#xff1a; Redis简介发布订阅模式介绍实现思路代码实现及详细解释 1. Redis简…

Python----类对象和实例对象

目录 一.类和类的实例 二.类属性和实例属性 三.私有属性和公有属性 四.静态方法和类方法 五.__init__方法&#xff0c;__new__方法和__del__方法&#xff1a; 六.私有方法和公有方法 七.方法的重载 八.方法的继承 九.方法的重写 十.对象的特殊方法 十一.对象的引用&a…

OpenCV滑块验证码图像缺口位置识别

OpenCV图像缺口位置识别 1、背景2、图像缺口位置识别原理3、图像缺口位置识别实现4、滑块验证码HTTP图像需要保存到本地吗1、背景 在使用Selenium完成自动化爬虫时,许多网站为了防止机器人爬取数据会使用验证码(例如滑块验证码)。通过Selenium动作操作,爬虫可以模拟用户输入…

由红黑树引出的HashMap扩容机制的思考

红黑树是什么&#xff1f; 三大特点&#xff1a; 根节点是黑色&#xff0c;叶节点是不存储数据的黑色空节点 任何相邻的两个节点不能同时为红色 任意节点到其可到达的节点间包含相同数量的黑色节点 联想&#xff1a;Java HashMap底层红黑树原理 HashMap基于哈希表Map接口实…

node与 pnpm、node-sass 等工具的版本兼容关系

1. node & pnpm 2. node & node-sass 3. node-sass & sass-loader sass-loader依赖于node-sass&#xff0c;以下是部分版本号对应

ES 万条以外分页检索功能实现及注意事项

背景 以 ES 存储日志&#xff0c;且需要对日志进行分页检索&#xff0c;当数据量过大时&#xff0c;就面临 ES 万条以外的数据检索问题&#xff0c;如何利用滚动检索实现这个需求呢&#xff1f;本文介绍 ES 分页检索万条以外的数据实现方法及注意事项。 需求分析 用 ES 存储数…