编译流程与预处理

简介: 编译流程与预处理

前言

之前在编码方向的学习都是在非常方便的编译器上进行的,直到一次gcc -v -o我才了解到编译器在我们写完代码之后做了非常多的事情,了解了这些之后也让我对之前很多的错误理解的更加通透,希望下面对编译器的介绍能给新手们一点指导(下面以c语言展开)


一、基本的编译步骤

cc1     .c -------> DNZ4.s                普通语言------编译(操作)------汇编语言

as       DNZ4.s-------->BW16.o        汇编语言-------汇编(操作)-------机器指令集

collect2       *.o(有好多)-------->  .exe        机器指令集--------链接 确定数据地址---------可执行文件

这三步里先阶段我们的错误大部分是在第一步,也就是语法错误,但随着学习的深入我们在第三步也是会出现错误的。

二、预编译

在编译器编译代码之前,类似printf这种关键字其实编译器是不认识的,这时候我们一般都是引用头文件去让编译器“学习”到这些关键字,预处理的符号就是#,就是在编译之前让编译器提前学习到一些关键字,这里分为头文件的预处理。

通过控制台对文件实现预处理之后,可以发现产生了一个 .i 的文件,文件里面已经用define定义的宏值替换代码里的宏名

我觉得非常变态的面试题:以下写法是否正确?

int define

一般关键字是不能拿来当变量名的,但是include,define这种必须要变成#define,#include才算是关键字,所以以上的写法是正确的!

以上的预处理指令新手平时见到的会非常多,下面的条件编译对于我这种非科班来说之前是未了解过的,但是在了解了这样的方法之后感觉真的是太方便了,有一种相见恨晚的感觉。

下面我们模拟一个场景,开发过程中我们为了调试,printf了很多数据来监测后台数据,但是产品发布的时候我们要尽量的缩小运行内存,不让这些printf执行,按照我之前的习惯就是一句一句把printf注销掉,但其实我们可以通过预处理很好的解决这个问题

这句话的意思是,如果我们定义过DEBUG那我们if判断成功,未定义过则进入else里的语句

这时候我们如果想检测后台数据,可以直接在代码上加一个#define DEBUG来触发if条件,不过这不是最好的方法(动了别人的代码),最好的办法是在编译上面做操作,这时候我们不要直接使用编译器给的默认的编译,cmd打开命令提示符面板,在编译语句前的--中间插入D加上你ifdefine后面的符号(D跟后面的符号是紧挨的),像如上我就应该写成 -DDEBUG -,如果这个.c文件叫a.c的话编译语句就是如下的。  


总结

了解编译器的编译流程能在以后解决问题的时候有更多的思路,也能对之前的问题有更好的理解,预处理的很多操作给我写项目的时候带来了极大的便利,慢慢了解自己使用的工具也是学习非常重要的一部分。

相关文章
|
10月前
|
弹性计算 人工智能 运维
阿里云算力服务的稳定性演进
本文介绍了弹性计算稳定性技术的基础能力研究,涵盖稳定性底座、实例异常检测、变更异常检测、风险规避和故障处置等方面。重点讲解了阿里云在ECS稳定性方面的进展,包括高可用架构设计、故障演练验证、持续运行阶段的稳定性保障以及相关工具和功能。此外,还探讨了Confidential AI的最佳实践,解决了大模型场景下的系统级安全风险,并介绍了机密计算产品的能力规划。最后,文章阐述了ACK容器服务的稳定性演进,包括高可用架构、托管节点池、供应链安全、事件体系、全链路检测、版本升级和成本管理等功能,确保用户能够获得高效稳定的容器服务体验。
|
11月前
|
监控 数据可视化 定位技术
2024年最强看板工具大对比:哪款最适合公司团建旅游活动策划?
本文介绍了5款看板工具(板栗看板、Trello、Asana、Monday.com、ClickUp)及其在公司团建旅游策划中的应用,通过具体案例展示了如何利用这些工具高效管理活动的各个环节,包括目的地规划、任务分配、预算管理、日程安排、团队沟通与反馈等,旨在提升团队协作效率和活动策划质量。
2024年最强看板工具大对比:哪款最适合公司团建旅游活动策划?
|
11月前
|
机器学习/深度学习 存储 人工智能
【AI系统】低比特量化原理
模型量化是将浮点数模型参数转化为低比特整数表示的技术,旨在减少模型大小、内存消耗及推理延迟,但会带来精度损失。本文介绍量化的基本原理、优势及挑战,涵盖量化训练、动态与静态离线量化等方法,并探讨线性与非线性量化、饱和与非饱和量化等技术细节。
516 2
【AI系统】低比特量化原理
|
前端开发 JavaScript 测试技术
前端研发链路之代码规范
大家好,我是徐徐。本文将探讨前端研发链路中的代码规范,包括业界流行规范、CSS命名规范和相关工具。通过保持代码整洁和一致性,不仅能提高团队协作效率,还能减少错误,提升开发质量。文中详细对比了几种常见的代码规范和工具,如 Airbnb Style Guide、BEM、Eslint 和 Prettier,并展望了未来代码规范的发展趋势。希望对大家有所帮助。
281 1
前端研发链路之代码规范
|
网络协议 数据挖掘 5G
适用于金融和交易应用的低延迟网络:技术、架构与应用
适用于金融和交易应用的低延迟网络:技术、架构与应用
561 5
|
机器学习/深度学习 人工智能 TensorFlow
利用AI技术实现智能垃圾分类
【8月更文挑战第67天】随着人工智能技术的不断发展,越来越多的应用场景开始涌现。本文将介绍如何利用AI技术实现智能垃圾分类,通过代码示例和实际应用案例,帮助读者了解AI技术在垃圾分类领域的应用价值和潜力。
923 19
|
数据采集 人工智能 自然语言处理
文档智能 & RAG让AI大模型更懂业务
文档智能 & RAG让AI大模型更懂业务
|
机器学习/深度学习 人工智能 自然语言处理
音频基座大模型FunAudioLLM评测
通义语音团队最新开源了音频基座大模型FunAudioLLM,包含两大模型SenseVoice和CosyVoice。本文对这两种大模型进行整体的评测。
606 1
音频基座大模型FunAudioLLM评测
|
监控 数据可视化 搜索推荐
有哪些好用的流程管理工具?帮你快速搞定复杂工作流程
在职场中,流程管理是企业高效运转的核心。本文测评了五款热门流程管理工具:板栗看板、Trello、Asana、Jira 和 Notion,从功能、易用性和适用场景等方面进行全面分析,帮助你选择最适合的工具,提升团队协作和项目管理效率。
478 0
|
存储 持续交付 虚拟化
Docker与VMWare优缺点
【10月更文挑战第18天】Docker与VMWare优缺点