09|编译准备:预处理器是怎样处理程序代码的?
该思维导图由 AI 生成,仅供参考
C 预处理器的相关背景知识
- 深入了解
- 翻译
- 解释
- 总结
C语言预处理器是C标准中的重要内容,通过对源代码进行处理,使得代码可以根据不同环境信息动态变化。预处理器提供了高效、灵活地组织C源代码的能力,包括文件包含、宏定义和条件编译等功能。预处理的基本流程包括删除注释、处理宏定义、条件预编译指令和文件包含预编译指令等步骤。在编写宏函数时,需要注意避免由C运算符优先级等因素导致的问题,例如为宏函数的返回值添加括号。文章通过介绍C预处理器的背景知识、预处理的基本流程以及宏编写技巧,帮助读者了解C预处理器的相关内容。同时,强调了预处理器的合适使用场景,包括定义程序中使用到的魔数、基于特定运行环境的条件编译和封装代码模板。文章还提供了一些技巧,如为宏函数的参数添加括号、警惕宏函数导致的多次副作用以及定义完备的多语句宏函数。总之,预处理器是一把“双刃剑”,合理使用可以让程序具备更强的动态扩展能力,但任意乱用可能会导致程序源代码的可读性大大降低,甚至引入难以调试的BUG。
《深入 C 语言和程序运行原理》,新⼈⾸单¥59
全部留言(9)
- 最新
- 精选
- LDxy看起来预处理器似乎是一个独立于编程语言的东西,那为何大多数语言不引入预处理器呢?这样想用宏的人可以用宏,不想用宏的人可以不用,不是更能满足程序员吗
作者回复: 就像你说的一样,其实大部分“现代语言”都不希望将预处理器作为语言自身标准的一部分,这意味着你可以用一些第三方提供的预处理能力来对源码进行编译前的处理。总的来看,大部分人认为预处理器的过度使用通常会导致项目整体结构的混乱,且不利于代码调试。并且宏作为简单的文本替换也不具备语义上的完备性(宏定义时的形式无法决定其具体使用时产生的效果)。因此,从语言的角度来看,大家都更倾向于做编译时优化,尽量让语言本身的特性就可以满足预处理器的使用场景。个人理解哈~
2021-12-274 - 骨汤鸡蛋面老师,请问下为什么c要有头文件呢
作者回复: 实际上这个问题要从 C 的发展历史上来看,头文件的一个重要目的就是为了能够提供一套对外稳定的接口文档,供其他程序使用已经写好的 C 代码实现,以实现代码重用。当然,不要直接把它与现代语言比如 Go、Python、Rust 等具有包管理器能力的语言相比。
2022-04-2022 - x#define _STR(x) #x // 将参数x变为字符串 #define _CONN(x,y) x##y // 将x和y参数连接在一起, (1,2)--> 122022-09-18归属地:广东5
- 小爷##的作用是连接的作用;而#的作用是就是把参数当作字符串代替。2022-03-075
- 贺志鹏#: 将宏的参数转换为字符串,这个操作称为"stringization"。 ##:将两个Token粘合成一个Token。2022-02-242
- linker## 用来连接字符串 # 操作符#在字符串中输出实参2021-12-271
- 白花风信子##有次在重构自己的小作业用过,有点类似在预处理中预处理的感觉qwq。2021-12-271
- Geek_00a01d思考题 交作业 使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.2022-12-20归属地:河南
- =#可以用来进行宏定义与替换、文件包含、条件编译、错误生成、行控制、预定义名称 ##可以用来进行token的联结2022-01-08