C语言——编译全过程的那些事

news2024/11/19 18:31:30

C语言——编译全过程的那些事

  • 一、C语言的编译过程
  • 二、编译的详细过程
    • 2.1预编译过程
    • 2.2编译过程
    • 2.3 汇编过程
    • 2.4链接过程
  • 三、编译全过程

一、C语言的编译过程

1.C语言的编译过程通常可以分为两个大的部分,编译和链接
在这里插入图片描述
2.在ANSI C的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行代码。
在这里插入图片描述

二、编译的详细过程

#include<stdio.h>

//预编译过程
#define N 3
int main()
{
    printf("%d",N);
    printf("hello world\n");
    return 0;
}

我们以上述代码为例讲解C语言的编译过程,编译过程优可以分为3个具体的部分,分别是,预处理(Prepressing),编译(Compilation),汇编(Assembly)。

2.1预编译过程

首先是源代码文件test.c和相关的头文件,如stdio.h等被预编译器预编译成一个.i文件。我们在gcc环境下进行演示。
第一步预编译的过程相当于如下命令(-E表示只进行预编译)。
gcc -E test.c -o test.i
在这里插入图片描述

预编译输出的test.i的文件的部分图示如下:
在这里插入图片描述

预编译过程主要处理那些源代码文件中的以“#”开始的预编译指令。比如“#include”、“#define”等,主要处理规则如下:
1、将所有的“#define”删除,并且展开所有的宏定义。
2、处理所有条件预编译指令,比如“#if”、“#ifdef”、“#elif”、“#else”、“#endif”。
3.处理所有的“#include"预编译指令,将被包含的文件插入到该预编译指令的位置。注意这个过程是递归的,也就是说被包含的文件也可能包含着其他的文件。
4.删除所有的注释"//"和 “/* */”。
5.添加行号和文件名标识。
6.保留所有的#pragma编译器指令,因为编译器需要使用它们。

2.2编译过程

编译过程就是把预编译过程处理产生的文件进行一系列的词法分析,语法分析,词义分析
以及优化后产生的相应的汇编代码文件。这个过程往往是我们所说的程序构建的核心部分。

gcc -S test.c -o test.s

2.3 汇编过程

汇编器是将汇编代码转换成机器可以识别的指令,每一条汇编语句几乎都对应着一条机器指令,所以汇编器的汇编过程相对于编译器的编译过程来说比较简单。它没有复杂的语义,也没有复杂的语法,也不需要做指令优化。只是根据汇编指令与机器指令的对照表进行一一翻译即可。

gcc -o test.s -o test.o

2.4链接过程

链接过程主要包括:
1.合并段表
2.符号表的合并和符号表的重定位

三、编译全过程

在这里插入图片描述

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

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

相关文章

Vue检测数据的原理

Vue能够对用户的数据进行响应式&#xff0c;也就是你在data中写了什么&#xff0c;你在模板中用到data的部分就会渲染成什么&#xff0c;那么Vue是怎么知道用户修改了data中的数据变化并对模板重新进行解析的呢&#xff1f; 在Vue将数据存储为自身的_data之前&#xff0c;Vue会…

《中国工业经济》企业数字化转型与供应链配置—集中化还是多元化

文章利用2010-2021年A股上市公司数据&#xff0c;从供应链治理角度系统验证了企业数字化转型对供应链配置的影响及其作用机制 研究发现&#xff0c;企业数字化转型显著降低了供应链上游供应商、下游客户以及供应链整体集中度&#xff0c;推动供应链配置多元化&#xff1b;该推…

python使用dataset快速使用SQLite

目录 一、官网地址 二、安装 三、 快速使用 一、官网地址 GitHub - pudo/dataset: Easy-to-use data handling for SQL data stores with support for implicit table creation, bulk loading, and transactions. 二、安装 pip install dataset 如果是mysql&#xff0c;则…

基于冠状病毒群体免疫优化的BP神经网络(分类应用) - 附代码

基于冠状病毒群体免疫优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于冠状病毒群体免疫优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.冠状病毒群体免疫优化BP神经网络3.1 BP神经网络参数设置3.2 冠…

7.memchr函数

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h>int main() {int* ans NULL;char arr[] "abcdef";int len 3;/*共查找len个字节*/char ch d;ans memchr(arr, ch, len);if (NULL ans){printf("前%d个字符中&#xff0c…

数据结构与算法课后题-第六章(图的基本概念)

文章目录 1 图的基本概念2 基本概念及术语1 有向图2 无向图3 简单图、多重图4 完全图5 子图6 连通 、连通图和连通分量7 强连通图、强连通分量8 生成树、生成森林 参考博客&#xff1a; 数据结构&#xff1a;图(Graph)【详解】 1 图的基本概念 2 基本概念及术语 1 有向图 2 无…

深度分析c+引用的本质以及引用与指针的区别

文章目录 引用的概念引用的定义引用的特性引用的权限问题引用的使用方式引用作参数引用作返回值指针的本质引用和指针的区别 引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用…

Oracle数据库SQL*Plus命令行执行SQL语句时,中文乱码报错解决方法

文章目录 问题背景解决方案1. 设置NLS_LANG环境变量2. 修改SQL*Plus字符集设置3. 使用Unicode字符集 常见错误和解决方法结语 &#x1f389;欢迎来到Java学习路线专栏~Oracle数据库SQL*Plus命令行执行SQL语句时&#xff0c;中文乱码报错解决方法 ☆* o(≧▽≦)o *☆嗨~我是IT陈…

【jmeter】接口测试流程

1、Jmeter简介 Jmeter是由Apache公司开发的一个纯Java的开源项目&#xff0c;即可以用于做接口测试也可以用于做性能测试。 Jmeter具备高移植性&#xff0c;可以实现跨平台运行。 Jmeter可以实现分布式负载。 Jmeter采用多线程&#xff0c;允许通过多个线程并发取样或通过独…

NTFS磁盘格式读写工具Tuxera NTFS 2023 for Mac中文破解版v2023含最新激活序列号

Tuxera NTFS 2023 Mac 是一个NTFS文件系统驱动程序&#xff0c;为解决Mac上不能对NTFS格式硬盘进行访问和读写而生。实现苹果Mac OS X系统读写Microsoft Windows NTFS文件系统&#xff0c;在硬盘、U盘等外接设备中进行全面访问、删除、修改等相关操作。 tuxera ntfs 2023 破解…

计算机网络第2章-CDN(4)

视频流和内容分发网 HTTP流和DASH 在HTTP流中&#xff0c;视频只是存储在HTTP服务器中作为一个普通的文件&#xff0c;每个文件有有一个特定的URL。当用户要看视频时&#xff0c;客户与服务器之间创建一个TCP连接并发送HTTP GET请求。 HTTP流具有严重缺陷&#xff0c;即所有…

扩大减产,NAND Flash市场迎来涨价潮 | 百能云芯

根据TrendForce的最新研究&#xff0c;NAND Flash市场即将面临一轮全面涨价的浪潮。供应商们通过严格控制产出量&#xff0c;将在第四季实施合约价的涨幅&#xff0c;预计在8%到13%之间。明年除非原厂仍能维持减产策略&#xff0c;且需留意服务器领域对Enterprise SSD需求是否回…

【Qt高阶】linux下编译提示找不到依赖的库【2023.10.16】

现象 提示找不到一些库文件。 排查方法 查看qmake出来的 makefile文件&#xff0c;相对路径是按照makefile文件所在路径进行查找。 命令行编译正常&#xff0c;拿QtCreator编译不过 把下面的勾去掉&#xff0c;直接在当前目录构建。

4.Vue-Vue调用第三方接口

题记 用vue调用第三方接口&#xff0c;以下是全部代码和操作流程。 寻找第三方接口网站 推荐&#xff1a;免费API - 提供免费接口调用平台 (aa1.cn) 下面的代码以下图中的接口为例 调用第三方接口代码 TestView.vue文件如下&#xff1a; <template> <div > <…

[nlp] chathome—家居装修垂类大语言模型的开发和评估

ChatHome: Development and Evaluation of a Domain-Specific LanguageModel for Home Renovation ChatHome: 家居装修垂类大语言模型的开发和评估 1、摘要: 我们的方法包括两个步骤:首先,使用广泛的家庭装修数据集(包括专业文章、标准文档和网络内容)对通用模型进行后预训…

【Operating Systems:Three Easy Pieces 操作系统导论 】抽象:地址空间

【Operating Systems:Three Easy Pieces 操作系统导论 】 早期系统 操作系统曾经是一组函数&#xff08;实际上是一个库&#xff09;&#xff0c;在内存中&#xff08;在本例中&#xff0c;从物理地址0开始&#xff09;&#xff0c;然后有一个正在运行的程序&#xff08;进程&…

记一次关于应用程序无法连接postgresql数据的问题排查

1. 完整的错误信息 could not connect to server: No such file or directory is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"? 2.排查过程 2.1.首先&#xff0c;我们先确保postgresql在运…

OpenHarmony创新赛丨报名倒计时,超强秘籍带你直通大奖!

OpenHarmony创新赛报名倒计时开始啦&#xff01; 设于开放原子全球开源大赛下的OpenHarmony创新赛&#xff0c;目前正在如火如荼地进行赛事招募中&#xff01;这次大赛围绕创新应用、商显行业、金融行业三大赛题&#xff0c;邀请来自企业、个人、高校师生等各界群体的优秀开发者…

浅谈安科瑞无线测温设备在俄罗斯某项目的应用

摘要&#xff1a;安科瑞ATE系列和ARTM-Pn无线测温设备适用于高低压柜的梅花触头&#xff0c;线缆&#xff0c;母排等位置对温度的实时监测。 Abstract: ATE series and ARTM-Pn are suitable for monitoring the real-time temperature of circuit breaker contact,cable,busb…

将license验证加入到系统中

1.将ClientDemo下的cn文件夹的内容导入项目对应的java目录下。 2.将license-config.properties文件导入resources目录下。 3.在项目的pom.xml中添加如下依赖。 <properties><!-- Apache HttpClient --><httpclient>4.5.5</httpclient><!-- License…