分布编译和注释

news2024/9/24 21:28:25

文章目录

  • 分布编译
    • 预处理
    • 编译
    • 汇编
    • 链接
  • 注释
    • 单行注释
    • 多行注释
    • 预处理注释
  • 总结

分布编译

  上一节使用 gcc main.c就生成了a.exe的可执行文件,提到了将main.c文件生成a.exe实际上执行了以下四步:

  • 预处理
  • 编译
  • 汇编
  • 链接
      每一步都有单独的指令,而且生成不同的文件,最后一步才会生成a.exe。下面采用同样的方式打开命令行,按照下列顺序分别输入以下指令,看看每一步你的文件夹下生成了什么新文件。
gcc -E main.c -o main.i
gcc -S main.i -o main.s
gcc -c main.s -o main.o
gcc main.o
gcc main.o -o b.exe

  运行了第四个指令,有没有发现文件并没有多,但是a.exe的修改日期变了。这是因为生成的文件名还是a.exe,但是把之前的覆盖了,所以看不到新文件产生。所以这里的第5条指令重新生成并且在生成的同时将生成的文件名变成b.exe。

预处理

  第一步预处理,生成了main.i文件,实际上这个-o 后面跟的就是要生成的文件名,我们只是把文件名改成main.i。你可以改成任何的名字,但是后缀尽量不要改。
  打开main.i文件,拉到最下方,刚好是之前我们在main.c敲的代码,但是第一行#include<stdio.h>没有了,其实这一步就是把stdio.h的文件拷贝到main.i文件了。
在这里插入图片描述

编译

  第二步编译,将.i文件编译生成.s文件。.s文件是汇编文件。还记得我们之前过的汇编语言吗,汇编文件就是使用汇编语言编写的文件。这一步就是生成汇编代码文件,如果用记事本打开,显示的内容你可能是看不懂的。这里面就是汇编执行,看看是不是有认识的单词。
在这里插入图片描述

汇编

  第三步汇编,将.s文件生成.o文件。.o文件是二进制文件,是给计算机看的,即使使用记事本打开,也是你看不懂的乱码。
在这里插入图片描述

链接

  有人可能会问,上一步汇编后生成的文件已经是二级制文件了,为什么还要第四步链接呢?
链接,这名字听起来就要一个以上的文件才能链接,为什么第四步只有一个文件呢?实际上这一步编译器会在你的电脑里找到他要链接的文件,比如:运行要用的库文件,以及你代码里用到的printf和getchar的真身。虽然把stdio.h复制过来了,但是实际上只复制了它们的名字,他们的真身还在其他文件,这一步就是链接他们的真身,生成可以运行的exe文件。
到后面学习分文件编程的时候,就会发现链接这一步的其他作用。
运行这个b.exe,会发现和a.exe没有什么区别。同样可以使用双击运行和命令行运行。
在这里插入图片描述

注释

  刚编写完的代码,你肯定是知道的。但是过了一段时间你还记得吗?别人写的代码给你看,你认识吗?我想,简单的代码你可能能看懂,但是上来给你一堆代码,你可能就慌了把。
别慌,我们的前辈们已经想好了一个好办法,那就是注释。既然编写了代码可能会忘,那我就加点自己的注释,用自己的语言来标记。注释,是给人看的,计算机不会翻译它,而且他在编译的预处理那一步就会删除注释。

单行注释

  顾名思义,单行注释,只能注释单行,它的语法如下,为了说明,我将为我们编写的main.c写一个注释。

#include<stdio.h>//导入名为stdio.h的头文件
int main()//程序的入口函数main
{
	printf("Hello World\n");//打印Hello World!并换行
	getchar();	//从键盘获取一个字符
	return 0;//main函数的结束,返回0
}

  加了以上的注释,阅读代码是不是认识汉字就理解意思了呢。单行注释就是在注释的内容前使用//,告诉编译器这是注释

多行注释

  顾名思义,多行注释,肯定能注释多行,它的语法如下,为了说明,我将为我们编写的main.c写一个注释。

/***
这是我编写的第一个程序
文件名:main.c
作者:Point_G
日期:2023.11.29
***/
#include<stdio.h>
int main()
{
	printf("Hello World\n");
	getchar();
	return 0;
}

  多行注释的语法就是/*** ***/在这几个星号直接的内容就是注释,可以跨越多行。这种注释一般用于文件头和函数头,说明文件和函数的作用。

预处理注释

  这里只做说明,这种语法一般用于注释代码,当你辛苦编写的代码不让用的时候,又不舍得改,可以使用这种语法。想用的时候把#if 0改成#if 1就可以。

#if 0
这是我编写的第一个程序
文件名:main.c
作者:Point_G
日期:2023.11.29
#endif
#include<stdio.h>
int main()
{
	printf("Hello World\n");
	getchar();
	return 0;
}

  尝试分布编译运行上面添加注释的三个程序,看看和没有添加注释前,生成的文件有没有不同。

总结

  其实以上四步做的不只上面描述的内容,还做了一些其他的事情,在这里给大家总结一下:

  • 预处理:头文件的展开、注释的删除、宏定义的替换;关于宏的内容我们后面会讲解,注释的删除,大家可以编写一个带注释的c文件,预处理指令生成的main.i文件看看是否还有注释。
  • 编译:词法分析 语法分析 ,程序编写的错误这一步是会检测的,但是只能检测到语法错误,无法检查到逻辑错误。比如:你希望计算机算出3+5的结果,你编写了35+,这就是语法错误,你如果写成2+3,语法没错误,计算机不会报错,但这不是你要求得结果。
  • 汇编:将汇编文件生成目标文件 .o 文件
  • 链接:链接库文件,生成最终的可执行文件

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

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

相关文章

C++学习之继承中修改成员权限细节

看看下面的代码 这是错误的 class A { public:int x 10; }; class B :public A {using A::x;int x 100; };看看函数 class A { public:void fun(){cout << "uuuu" << endl;} }; class B :public A { public:using A::fun;void fun(){cout << …

每天学习一点点之 MySQL TINYINT

我已经不是第一次遇到关于 TINYINT 的问题了。在 MySQL 中&#xff0c;当我们将某个字段设置为 TINYINT&#xff0c;随着业务的扩展&#xff0c;我们可能会发现 TINYINT 的范围无法满足需求。这时需要修改字段属性。但如果表的数据量很大&#xff0c;或者由于分表导致涉及的表数…

AI虚拟数字人——营销宣传领域的新亮点

AI生活节即将到来&#xff0c;邀请消费者共同探索生活小妙趣&#xff0c;为美好生活注入新的想象。AI一词我们过去可能听的比较多&#xff0c;听到最多的可能就是AI虚拟数字人了。这年头&#xff0c;打造一个AI主播、虚拟数字人已经屡见不鲜了&#xff0c;因为AI数字人拥有强大…

数字孪生3D场景开发工具:弥补不足,开拓全新可能

随着数字化时代的来临&#xff0c;越来越多的企业和行业开始探索数字孪生技术的应用。数字孪生是指通过数字技术将现实世界中的物体、场景等复制到虚拟世界中&#xff0c;以实现实时监测、预测和优化。然而&#xff0c;在数字孪生的发展过程中&#xff0c;一些不足也逐渐浮现。…

AndroidStudio - 新版本 Logcat 使用详解

最近这俩天正好有时间给自己做一下减法&#xff0c;忘记是去年还是今年&#xff0c;在升级 AndroidStudio 后使用 Logcat查看日志的方式也发生了一些变化&#xff0c;虽然一直在使用&#xff0c;但每当看到之前还未关闭 Logcat 命令行工具额昂也&#xff0c;就感觉可能还存在知…

基于springboot的社区团购系统设计

摘 要 本课题是根据用户的需要以及网络的优势建立的一个社区团购系统&#xff0c;来满足用户团购的需求。 本社区团购系统应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于Spring Boot框架开发。在网站的整个开发过程中&#xff0c;首先对系统进行了需求分析&…

手持机|三防智能手机_4寸/5寸/6寸安卓系统三防手机PDA手持终端方案

随着科技的不断发展&#xff0c;三防手持机作为一种多功能设备&#xff0c;正逐渐在各行业得到广泛应用。这款手持机采用高性能处理器&#xff0c;支持高精度北斗定位和工业本安防爆功能&#xff0c;并具备IP67级防水防尘性能和1.5米防跌落能力。因此&#xff0c;它在仓储管理、…

C语言进阶之笔试题详解(2)

前言 这里的内容包括二维数组笔试题和指针笔试题&#xff0c;供给读者对这部分知识进行加深和巩固。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 前言 笔试题 二维数组 题目…

nvm 下载node时候下载不到npm包的解决方法

个人博客链接 公众号-nvm 下载node时候下载不到npm包的解决方法 求关注 可以跳过的背景 最近项目比较有空&#xff0c;所以就可以有时间写一些demo&#xff0c;主要测试下react的一些语法&#xff0c;毕竟自己上次写react已经是22年的7月份了,期间对于react-router等的hook…

差分阻抗90Ω±10%或者其他分别走什么阻抗

差分阻抗90Ω10%或者其他分别走什么阻抗 普通走线阻抗HDMI接口布线要求USB接口布线要求网口接口布线要求LCD 接口布线要求DDR3关键信号处理要点 普通走线阻抗 必须选择 PCB 走线阻抗来匹配使用中的所有逻辑系别的特性阻抗(对于 CMOS 和 TTL&#xff0c;特性阻抗的范围是 80~11…

Java 多线程循环打印

文章目录 一、标志变量 互斥锁二、标志变量 synchronized三、标志变量 互斥锁 条件变量四、原子变量五、信号量 一、标志变量 互斥锁 标志变量用于标识当前应该是哪个线程进行输出&#xff0c;互斥锁用于保证对标志变量的互斥访问。 public class Main {private static …

分享常见msvcp140.dll丢失的解决方法,msvcp140.dll修复的问题

在使用电脑的过程中可能会出现关于msvcp140.dll丢失的问题&#xff0c;通常出现这样的问题都会导致电脑中的程序出现不能正常运行的情况。并且如果不及时将msvcp140.dll修复的话可能还会导致电脑出现其他的问题。这篇文章就将给大家介绍关于msvcp140.dll丢失的解决方法。 一.常…

美国第三季度经济GDP数据亮眼,其增长率上修至近2年最快

KlipC报道&#xff1a;美国商务部公布美国第三季度GDP按年率增长5.2%&#xff0c;较首次预估数据上调了0.3%。也是近2年来最快增速。 KlipC的分析师表示&#xff1a;“相较于第二季度相比&#xff0c;第三季度的时机GDP主要反映了消费者指出和私人库存投资的加速和出口的上升。…

Prosys OPC Client连接OPC DA

Prosys OPC Client连接OPC DA Prosys OPC 客户端将帮助排除 OPC 连接故障并测试 OPC 服务器。 您可以读写数据、浏览服务器以及导出和导入地址空间。 OPC 客户端轻巧、快速且易于使用。 支持 OPC DA 1.0a 和 OPC DA 2.05a 官方地址: https://www.prosysopc.com/products/opc-…

XUbuntu22.04之安装OBS30.0强大录屏工具(一百九十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

颜色十六进制代码对照表

白色 #FFFFFF 2 红色 #FF0000 3 绿色 #00FF00 蓝色 #0000FF 5 牡丹红 #FF00FF 6 青色 #00FFFF 黄色 #FFFF00 8 黑色 #000000 9 海蓝 #70DB93 巧克力色 #5C3317 11 蓝紫色 #9F5F9F 12 黄铜色 #B5A642 亮金色 #D9D919 14 棕色 #A67D3D 15 青铜色 #8C7853 2号青铜色 #A67D3D 17 士…

基于SSM搭建系统

原理 SSM集成 SpringSpringMvcMybatis集成 框架集成核心&#xff0c;如果你的项目中&#xff0c;用到了Spring框架&#xff0c;那么其他框架主要就是和Spring集成&#xff1b; 和Spring集成的核心思路&#xff1a; 把当前框架的核心类&#xff0c;交给Spring管理&#xff08…

C++: string的模拟实现

C: string的模拟实现 一.前置说明1.模拟实现string容器的目的2.我们要实现的大致框架 二.默认成员函数1.构造函数2.拷贝构造函数1.传统写法2.现代写法 3.析构函数4.赋值运算符重载1.传统写法2.现代写法 三.遍历和访问1.operator[]运算符重载2.iterator迭代器 四.容量相关函数1.…

ant design vue3 处理 ant-card-head ant-tabs靠左边对齐之has选择器不生效

火狐浏览器是不支持has的。 解决方法&#xff1a;通过position来解决。

拥抱未来:大语言模型解锁平台工程的无限可能

01 了解大型语言模型 (LLM) 大型语言模型&#xff08;LLM&#xff09;是一种人工智能&#xff08;AI&#xff09;算法&#xff0c;它使用深度学习技术和海量数据集来理解、总结、生成和预测新内容。凭借合成大量信息的能力&#xff0c;LLM 可以提高以前需要人类专家的业务流程的…