分布编译和注释

文章目录

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

分布编译

  上一节使用 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.hqwc.cn/news/234916.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用MechanicalSoup库的爬虫程序

1. 首先&#xff0c;我们需要导入MechanicalSoup库和requests库&#xff0c;这两个库都是Python中爬虫常用的库。 2. 接着&#xff0c;我们要设置一个代理服务器&#xff0c;使用proxy_host和proxy_port参数来指定。 3. 使用requests.get方法来获取网页的HTML代码。 4. 使用Bea…

C++:OJ练习(每日练习系列)

编程题&#xff1a; 题一&#xff1a;字符串相加 415. 字符串相加 - 力扣&#xff08;LeetCode&#xff09; 思路一&#xff1a; 第一步&#xff1a;需要获取字符串的两个尾节点下标&#xff1b; 第二步&#xff1a;创建用于记录进位数、获得的字符串的变量&#xff1b; 第…

随手写了个博客多平台发布脚本:Python自动发布文章到Wordpress

​ 引言 作为一名技术博主&#xff0c;提高博客发布效率是我们始终追求的目标。在这篇文章中&#xff0c;我将分享一个基于Python的脚本&#xff0c;能够实现博客多平台发布&#xff0c;具体来说&#xff0c;是自动发布文章到WordPress。通过这个简单而高效的脚本&#xff0c…

2023 年 IntelliJ IDEA下载、安装教程,附详细图文

大家好&#xff0c;今天为大家带来的是 2023年 IntelliJ IDEA 下载、安装教程&#xff0c;超详细的图文教程&#xff0c;亲测可用。 文章目录 1 IDEA 下载2 IDEA 安装3 IDEA 使用4 快捷键新手必须掌握&#xff1a;Ctrl&#xff1a;Alt&#xff1a;Shift&#xff1a;Ctrl Alt&a…

解决电脑蓝屏问题:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED,回到系统还原点

解决电脑蓝屏问题&#xff1a;SYSTEM_THREAD_EXCEPTION_NOT_HANDLED&#xff0c;回到系统还原点 1&#xff0c;蓝屏显示问题1.1&#xff0c;蓝屏1&#xff0c;清楚显示1.2&#xff0c;蓝屏2&#xff0c;模糊显示 2&#xff0c;排除故障问题3&#xff0c;解决蓝屏的有效方法 1&a…

【攻防世界-misc】[简单] 凯撒大帝在培根里藏了什么

1.下载文件&#xff0c;打开后是这样子的 2.根据题目提示说是有凯撒密码和培根密码&#xff0c;因为文件内容为AB形式&#xff0c;不符合凯撒条件&#xff0c;所以先用培根解&#xff0c;将文件内容复制&#xff0c;CTF在线工具-CTF工具|CTF编码|CTF密码学|CTF加解密|程序员工具…

软件工程--需求工程--学习笔记(超详细)

软件需求工程是软件开发周期的第一个阶段&#xff0c;也是关系到软件开发成败最关键阶段&#xff0c;本章讲解需求的基础知识和需求工程的关键活动。这些知识对于结构化方法、面向对象方法、面向服务方法等都是适用的 本文参考教材&#xff1a;沈备军老师的《软件工程原理》 目…

Redis String类型

String 类型是 Redis 最基本的数据类型&#xff0c;String 类型在 Redis 内部使用动态长度数组实现&#xff0c;Redis 在存储数据时会根据数据的大小动态地调整数组的长度。Redis 中字符串类型的值最大可以达到 512 MB。 关于字符串需要特别注意∶ 首先&#xff0c;Redis 中所…

ROS2+STM32小车红外对射光电计数器模块资料

数据&#xff1a;一个周长内有20个孔洞或者20个分隔。外径&#xff1a;6.8cm 图片不是实物图&#xff0c;是示意图 因为没有串口&#xff0c;所以不可能会发送出数字的&#xff0c;就是通过电压变化次数来计算距离或者其他数据 有遮挡时&#xff0c;输出高电平&#xff0c;无遮…

主流数据库类型总结

前言&#xff1a;随着互联网的高速发展&#xff0c;为了满足不同的应用场景&#xff0c;数据库的种类越来越多容易混淆&#xff0c;所以有必要在此总结一下。数据库根据数据结构可分为关系型数据库和非关系型数据库。非关系型数据库中根据应用场景又可分为键值&#xff08;Key-…

Vue3-路由

VueRouter4路由语法解析 1.创建路由实例由createRouter实现 2.路由模式 1&#xff09;history模式使用createWebHistory()&#xff1a;地址栏不带# 2&#xff09;hash模式使用createWebHashHistory()&#xff1a;地址栏带# 3&#xff09;参数是基础路径&#xff0c;默认/ …

python高级练习题库实验1(A)部分

文章目录 题目1代码实验结果题目2代码实验结果题目3代码实验结果题目4代码实验结果题目总结题目1 输入一个整数,用于控制输出*的个数,输入日期,按照特定格式输出 研究下面的例子,并编写一个与这些例子完全相同的程序。 代码 import datetime# ask user for length of b…