预处理机制

news2024/9/22 9:43:57

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

预处理类别

宏定义:#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的本质就是纯文本包含。
  • 善用条件编译:在庞大工程代码的配置裁剪工作中,绝大多数的技术手段就是利用条件编译,对不同的代码选用和删除,达到代码裁剪的效果。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YM5411 WIFI 5模块 完美替代AP6256

YM5411是沃特沃德推出的一款低成本,低功耗的模块,该模块具有Wi-Fi(2.4GHz和5GHz IEEE 802.11 a/b/g/n/ac)蓝牙(BT5.0)功能,并通过了SRRC认证,带mesh,完美替换AP6256。高度…

和数集团出席中科院上海高研院​第三十三期“高研交叉论坛”信息能源融合专场

2023年11月21日,中国科学院上海高等研究院第三十三期“高研交叉论坛”信息能源融合专场在上海高研院成功举办。本次论坛由中国科学院上海高等研究院智能信息通信技术研究与发展中心、中国科学院低碳转化科学与工程重点实验室、中科院和数智能区块链与能源系统应用联…

AndroidNDK开发之交叉编译

在Android studio2.2以及以上,构建原生库的默认工具是cmake。 CMake是一个跨平台的构建工具,可以使用简单的语句来描述所有平台的安装(编译过程)。 能够输出各种各样的makefile或者project文件。cmake并不直接构建出最终的软件,而是产生其他工…

MySQL错误之ONLY_FULL_GROUP_BY

报错信息: 翻译: 对该报错的解释 所以,实际上该报错是由于在SQL查询语句中有group by,而这个包含group by的SQL查询写的并不规范导致的,这个ONLY_FULL_GROUP_BY模式开启之后检查就会很严格,如果select列表…

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

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

1、postman的安装及使用

一、安装、登录 1.安装 下载地址 2.注册登录(保存云服务进度) 二、界面介绍 三、执行接口测试页面 请求页签: 1、params:当是get请求时,通过params传参 2、authorization:鉴权 3、headers&#xff1…

STM32 中断系统

单片机学习 目录 文章目录 前言 一、中断系统 1.1 什么是中断 1.2 中断优先级 1.3 中断嵌套 1.4 C语言中的中断程序 二、STM32的中断通道和中断向量 2.1 中断通道 2.2 嵌套向量中断控制器NVIC 2.2.1 什么是NVIC 2.2.2 NVIC基本结构 2.2.3抢占优先级和响应优先级 2.2.4 NVIC的优…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《计及电动汽车需求响应的高速公路服务区光储充鲁棒优化配置》

这个标题涉及到一个关于高速公路服务区的优化配置问题,其中考虑了电动汽车需求响应和光储充的因素。让我们逐步解读这个标题: 高速公路服务区: 涉及到高速公路上的服务区,这是供驾驶员休息、加油、用餐等的地方。 电动汽车需求响…

SEM代运营的服务费用为什么不按广告费比例抽佣?

如果SEM代运营公司是按广告费比例来抽取佣金,就意味着客户的广告费花得越多,代运营公司的收入也就越高。本来应当屏蔽掉的无效广告点击和恶意点击,出于代运营公司自身利益考虑,处理这些事情时也就不那么干脆利索。只要能保障客户有…

gvim中的捕获替换

有些时候我们在使用vim的时候,希望将其中的某些pattern, 替换成另外的pattern, 直接使用替换的话,会将某些不属于这个pattern的地方给误替换,因此可以采用如下的方式; 简单说下规则: \ ( \) : 用括号将需要捕获…

springboot 外部化配置

背景:修改jar包中的配置比较麻烦 项目部署的时候放一个配置文件在jar包外 配置文件优先级: 1.jar包内的application.properties/yaml 2.jar包内的application-{profile}.properties/yaml 3.jar包外的application.properties/yaml 4.jar包外的application-{profile}.properties…

指针变量与指针类型的深入理解

1.知识总结 相关代码展示 #include <stdio.h> int main() {int n 0x11223344;int *pi &n; *pi 0; return 0; } #include <stdio.h> int main() {int n 0x11223344;char *pc (char *)&n;*pc 0;return 0; } #include <stdio.h> int main() {i…

解决Vscode使用git提交卡住的问题

使用Vscode的git提交代码经常会很慢/卡住。 先点击左下角&#xff0c;进入设置 找到git的配置(建议直接搜索)&#xff0c;把use Editor As commit input的勾选去掉即可解决。

【C++干货铺】适配器 | stack | queue

个人主页点击直达&#xff1a;小白不是程序媛 C系列学习专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 stack的介绍和使用 stack的介绍 stack的使用 queue的介绍和使用 queue的介绍 queue的使用 容器适配器 什么是适配器 STL中stack和queue的底层结构 d…

Ubuntu 23.10 服务器版本 ifconfig 查不到网卡 ip(已解决)

文章目录 1、问题描述2、 解决方案 1、问题描述 服务器&#xff1a;ubuntu 23.10 经常会遇到虚拟机添加仅主机网卡后&#xff0c;通过 ifconfig 无法获取其网卡 ip 2、 解决方案 修改网卡配置文件&#xff1a; # 进入网卡配置文件目录 cd /etc/netplan # 备份原始文件 cp …

MAV3D:从文本描述中生成三维动态场景

Singer U, Sheynin S, Polyak A, et al. Text-to-4d dynamic scene generation[J]. arXiv preprint arXiv:2301.11280, 2023. MAV3D 是 Meta AI 研究者们提出的一种从文本描述生成三维动态场景的方法。从所提供的文本生成的动态视频输出可以从任何摄像机位置和角度查看&#xf…

基于python和django旅游管理系统

基于python和django旅游管理系统 摘要 基于Python和Django的旅游管理系统是一个以现代化技术为基础的系统&#xff0c;旨在提升旅游行业的管理效率和服务水平。该系统以Django框架为核心&#xff0c;结合Python编程语言的灵活性和强大的生态系统&#xff0c;实现了多方面的功能…

极兔速递单号查询,极兔速递物流查询,一键复制查询好的物流信息

批量查询极兔速递单号的物流信息&#xff0c;并将查询好的物流信息一键复制出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 极兔速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的朋友记得先注册&…

CP_AUTOSAR分层软件架构内容简介

目录 0、前言1、综述1.1 AUTOSAR应用范围及拓展性1.2 架构总体介绍 0、前言 随着汽车功能需求日益增加&#xff0c;稳定安全的AUTOSAR分层软件架构逐渐作为一个热词呈现在汽车电子软件开发领域。那么AUTOSAR分层软件架构到底包括了哪些内容&#xff1f;架构之间的是什么关系&am…

mac mysql连接中断重新启动办法

遇到如图所示问题&#xff0c;可以用下面的命令重启mysql服务 sudo /usr/local/mysql/support-files/mysql.server start