编译流程与预处理

简介: 编译流程与预处理

前言

之前在编码方向的学习都是在非常方便的编译器上进行的,直到一次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的话编译语句就是如下的。  


总结

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

相关文章
|
人工智能 安全 机器人
重磅发布的「AI视频通话」如何10分钟就实现?
2024年,OpenAI发布GPT-4o,支持文本、音频和图像的组合输入与输出,使交互更接近自然交流。传统语音助手需经历多阶段处理,容易出现延迟或误解,体验感差。本文介绍如何在阿里云上快速创建可视频通话的AI智能体,实现拟人化交互、精准感知、情绪捕捉等功能,提供高质量、低延时的音视频通话体验。通过简单的部署流程,用户可以轻松创建并体验这一先进的人机交互技术。点击“阅读原文”参与活动赢取惊喜礼物。
|
Cloud Native Java Devops
Java 学习路线之环境搭建微服务项目实战及 DevOps 流程实操内容解析
这是一份结合最新技术的Java学习路线,涵盖环境搭建、微服务项目实战及DevOps流程。内容包括2025年版开发环境配置(如SDKMAN管理JDK、)、Gradle构建工具使用、微服务图书管理系统实战(Spring Boot 3.3 + Spring Cloud 2025.0)、云原生部署)、AI融合实践(OpenAI集成)以及性能优化与监控(JFR/Micrometer/Sleuth)。通过每日实践、代码审查和技术分享,帮助你掌握现代企业级开发技能,实现云原生应用的独立开发与部署。资源地址:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
734 0
|
算法 Python
传统流程图和N-S(又称盒图或NS图)结构流程图
传统流程图和N-S(又称盒图或NS图)结构流程图
3171 2
|
存储 人工智能 安全
机密计算容器前沿探索与 AI 场景应用
机密计算容器前沿探索与 AI 场景应用
|
存储 缓存 关系型数据库
7.2.7 【MySQL】用于分组
7.2.7 【MySQL】用于分组
169 0
|
移动开发 小程序
分析实时云渲染在小程序中可行性应用
实时云渲染是可以应用于小程序中的,因为小程序其实从技术角度来说,X小程序的本质是H5网页,其实和我们在电脑上打开网页道理差不多,只不过小程序还有些其他的特定。而云流化在网页中打开是基础功能,因此在将需要流化的3D应用程序流化出的地址直接内嵌于小程序中,即可实现小程序中打开服务器端的3D应用并进行实时的交互。
404 0
分析实时云渲染在小程序中可行性应用
|
机器学习/深度学习 人工智能 自动驾驶
增强智能与人工智能趋向融合,人机协同新时代正在到来
几十年各自发展的人工智能与增强智能,现在却走向了协同融合发展的道路,人机协同新时代正在到来。
1556 0