一个源文件到程序的生命历程需要经过编译和链接两部分,类比的话就像组装机器人,要经过打磨零件和拼接零件的过程.
编译可分为预编译(预处理)(.i文件后缀),编译(.s文件后缀),汇编(.o文件后缀)三个过程.
简单来讲,预编译就是操作#部分(#开始的预编译指令)与删除注释的阶段,比如常见的#include<stdio.h>,#define......都会在这一步完成操作.
稍微具体一点来讲就是 1.将头文件包含的内容插入进来
2.将define里定义的值、公式对源文件中相关部分进行替换
例如
经过预处理会变成
还有
经过预处理会变成
3.处理条件编译指令(if、ifdef、#elif等等)
这个就类似于平常用的if、else条件语句,只不过它是预处理阶段 就完成的,也就是程序还没有运行的时候,因此相对来说它执行的 速度更快,通常用在排除程序故障,选择执行程序等.
当然,还有添加行号和文件名标识,方便后续编译器调试信息;保留所有的 #pragma的编译指令,编译器后续会使用等等,因为可能不是太重要,就不想 讲.
编译过程就是将经过预编译后的文件翻译成汇编文件的过程,跟我们从语文上理解一段话的意思相同,我们会拆分主语、谓语、动词、宾语等等,然后按照理解顺序将其拼合成一个树状结构,然后根据语境来分析语义. 到了计算机这边就是将你的代码拆分成一个一个词,然后按照我最终要实现什么-->我要实现这一目标的小目标是什么进行一步一步的成分合成一个树状结构.如图:
最后分析,整形+整形等到整形,整形相乘得到整形,最终值即为整形.
汇编过程就是将汇编代码翻译成二进制指令代码的过程.
链接过程如同字形,就是最终将一个个小程序合成一个大程序的过程.
编译和链接简单介绍已经结束了,接下来就是简单拓展一下预处理的宏的一些骚操作.
#define,其实可以写得很像函数比起格式像c语言中的函数,我倒觉得它更像py中书写函数,因为它不需要对参数定义类型,但它又有着运行比函数快的特点,所以在完成一些简单功能的时候选择宏的效果可能要比函数要好.
万物皆是双刃剑,与函数相比,宏不能够递归,同时无法调试看到过程,所以在写一些比较复杂功能的时候还是老老实实选择函数吧.
文章到这里就结束了,因为是简单快速了解,所以不会很细致,如有哪里错误或有疑问欢迎指正.