C语言之程序环境和预处理(1)

news2024/11/14 11:17:18

本章主要以图片和文字的形式给大家讲解

程序的翻译环境和程序的执行环境

在ANSI C的任何一种实现中,存在两个不同的环境。
第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。
第2种是执行环境,它用于实际执行代码

2. 详解编译+链接

2.1 翻译环境

在这里插入图片描述
在这里插入图片描述
这是笼统讲解,那么真正的细节是如何的呢
我们看下图
在这里插入图片描述
组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)
每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序
链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中

每个源文件都会经过编译器的单独的处理生成自己对应的目标文件
编译器只有一个,这里的图片只是为了给大家看一下效果
在这里插入图片描述

2.2 编译本身也分为几个阶段

在这里插入图片描述
看代码

//sum.c
int g_val = 2016;
void print(const char* str)
{
	printf("%s\n", str);
}
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	extern void print(char* str);
	extern int g_val;
	printf("%d\n", g_val);
	print("hello bit.\n");
	return 0;
}

这里需要给大家讲解一下,我们使用VS2019编译器
看下面代码

//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
extern int Add(int x, int y);
int main()
{
	int a = 10;
	int b = 20;
	int sum = 0;
	sum = Add(a, b);
	printf("%d\n", sum);
	return 0;
}
//sum.c
#define _CRT_SECURE_NO_WARNINGS 1
int Add(int x, int y)
{
	return x + y;
}

我们用画图的形式讲解
在这里插入图片描述
如果没怎么看懂的可以对比下图去理解
在这里插入图片描述

在这里插入图片描述
如何查看编译期间的每一步发生了什么呢?

//test.c
#include <stdio.h>
int main()
{
 	int i = 0;
 	for(i=0; i<10; i++)
 	{
		printf("%d ", i);
 	}
 	return 0;
}

1. 预处理 选项 gcc -E test.c -o test.i
预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中
2. 编译 选项 gcc -S test.c
编译完成之后就停下来,结果保存在test.s中
3. 汇编 gcc -c test.c
汇编完成之后就停下来,结果保存在test.o中

VIM学习资料
简明VIM练级攻略:

https://coolshell.cn/articles/5426.html
给程序员的VIM速查卡
https://coolshell.cn/articles/5479.html

2.3 运行环境

程序执行的过程:
1程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成
2程序的执行便开始。接着便调用main函数
3开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值
4终止程序。正常终止main函数;也有可能是意外终止

本章终,下一章我们接着将链接等其他部分

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

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

相关文章

东南亚骑行类目热销品出炉!Shopee/Lazada跨境卖家有哪些优势产品可做?

菲律宾/巴西是Lazada/Shopee骑行品类卖家体量最大的2个站点&#xff0c;新加坡/越南/马来西亚紧随其后. 体量&#xff1a;在东南亚&#xff0c;菲律宾与新加坡对骑行的需求最强烈&#xff0c;其次是越南&#xff0c;三地总订单占总体70%以上&#xff0c;在南美地区&#xff0c…

Revit碰撞检查:Navisworks“复合对象碰撞”的使用

一、Navisworks 中碰撞检查中“复合对象碰撞”有什么用? 通常情况下我们使用 Revit 做好了模型&#xff0c;然后使用 Navisworks这款软件进行碰撞检查等优化工作。因为 Navisworks 相对于 Revit的软件数据要“轻”很多&#xff0c;可以让多专业的模型都在一起导入来进行全专业…

对接口进行限流?

在高并发的情况下&#xff0c;我们可以把消息放入队列&#xff0c;在从队列消费&#xff0c;达到限流的目的。但这里说的限流指的是当我们请求其他服务器接口&#xff0c;防止高并发下把对面服务器压垮&#xff0c;于是对我们要求每秒限制在100QPS。 如果使用springCloud可以用…

准备换工作跳槽面试人一定要看的的18条忠告

1、如果想好要跳槽就别犹豫&#xff0c;不用纠结太多外在因素&#xff0c;很多事情只有去做了才知道。&#xff08;当然&#xff0c;如果你是非某家公司不可的话&#xff0c;那可以慢慢等待机会&#xff09; 2、关于跳槽的渠道&#xff0c;主要有四种&#xff1a;直接被公司挖…

测试自动化的演进,从录制回放到对象映射

概要&#xff1a;在短时间的市场化和短期冲刺的文化中&#xff0c;测试人员通过使用测试自动化实践和工具保持同步是至关重要的。本文跟踪从基于脚本的测试与硬编码数据到自动化框架的转变&#xff0c;探索测试自动化的开始和到今天的演变 - 并且可能的未来走向。 今天的软件市…

Qt之QDial选择器

文章目录 前言一、QDial是什么二、操作api信号与槽示例代码总结 前言 Qt是一种流行的跨平台的C GUI应用程序开发框架&#xff0c;用于构建图形用户界面(GUI)和其他桌面应用程序。QDial是Qt框架中的一个小部件&#xff0c;用于创建旋转式的拨号器。本文将介绍如何使用QDial进行…

ChatGLM Efficient Tuning效率调试PEFT

ChatGLM Efficient Tuning 基于 PEFT 的高效 ChatGLM-6B 微调。 [ English | 中文 ] 更新日志 [23/06/05] 现在我们实现了 4 比特的 LoRA 训练&#xff08;也称 QLoRA&#xff09;。请尝试使用 --quantization_bit 4 参数进行 4 比特量化微调。&#xff08;实验性功能&#…

Echarts实现流程图关系图拓扑图

实现如下&#xff0c;可以横着排竖着排都可以 1.先写个div做画布 ref值随意&#xff0c;但是一点要写 <div style"height: 400px;" ref"echartdom"></div> 2.下载echarts 我这边下载的是 "echarts": "^4.9.0",最新版应…

奢侈品回收APP系统开发功能有哪些?

奢侈品售卖回收APP系统开发功能有哪些&#xff1f; 1.回收品牌分类&#xff1a;奢侈品回收APP平台可以将支持回收鉴定的奢侈品品牌及商品进行分类展示&#xff0c;方便用户查看自己的想要出售的是不是平台支持的商品。 2.商品在线检索&#xff1a;客户可以直接按…

STM32F4_红外遥控

目录 1. 红外遥控简介 2. NEC协议 3. 硬件设计 4. 实验程序详解 4.1 main.c 4.2 Remote.c 4.3 Remote.h 1. 红外遥控简介 红外遥控是一种无线、非接触的控制技术。具有抗干扰能力强&#xff0c;信息传输可靠&#xff0c;功耗低&#xff0c;成本低&#xff0c;易实现等优…

深入理解Redis的AOF和RDB持久化机制

Redis的AOF&#xff08;Append-Only File&#xff09;和RDB&#xff08;Redis Database&#xff09;是两种常见的持久化机制&#xff0c;用于将内存中的数据保存到磁盘上&#xff0c;确保数据在Redis重新启动时的持久性。本文将深入介绍AOF和RDB的原理和使用&#xff0c;帮助读…

HQChart实战教程65-自定义手机端分时图tooltip显示数据

HQChart实战教程65-自定义手机端分时图tooltip显示数据 手机端分时图tooltip步骤1. 配置手机端tooltip2. 替换k线tooltip格式化输出函数2. 格式化输出函数说明HQChart插件源码地址完整的demo源码手机端分时图tooltip hqchart手机端内置一个tooltip,显示手势所在K线的信息。默认…

邮件打开率低?来看看这几招提高邮件打开率!

什么是邮件打开率&#xff1f; 邮件打开率&#xff1a;简单来讲就是收件人打开的邮件数占发送邮件总数的百分比。 我们要做的就是如何吸引收件人打开邮件&#xff0c;那可以从以下几个方面来考虑&#xff1a; 1、邮件标题 邮件标题直接向收件人表达了这封邮件是关于什么的&am…

CSS样式优先级怎样划分?【CSS优先级规则】

定义CSS样式时&#xff0c;经常出现两个或更多样式规则应用在同一元素上的情况。此时CSS就会根据样式规则的权重&#xff0c;优先显示权重最高的样式。CSS优先级指的就是CSS样式规则的权重。在网页制作中&#xff0c;CSS为每个基础选择器都指定了不同的权重&#xff0c;方便我们…

【内存问题真的很烦人】linux内存等资源管理 以及 linux内存不足解决办法

linux内存不足解决办法 ///这一部分存在疑问 查看目录下文件夹大小 du -h --max-depth1 看具体哪个文件夹占用内存过高&#xff0c;一般是日志&#xff0c;删除即可。 ///这一部分存在疑问&#xff0c;上面的文件夹可以代表内存吗&#xff1f; 内存不够 top 命令 看内存占用…

Python就业前景如何?三大就业岗位分享

Python是一门面向对象的编程语言&#xff0c;编译速度超快&#xff0c;从诞生到现在已经20来个年头了。Python的排名从去年开始就借助人工智能持续上升&#xff0c;Python的火热&#xff0c;也带动了工程师们的就业热。 据统计&#xff0c;现在初级Python工程师的起薪一般在10…

【 Lucas-Kanade光流法】

这里写目录标题 1.1 Lucas-Kanade光流法1.1 Lucas-Kanade光流法详细步骤&#xff1a; 1.1 Lucas-Kanade光流法 Lucas-Kanade光流法是一种密集光流估计方法&#xff0c;用于计算图像中每个像素的运动向量。它假设在相邻帧之间&#xff0c;像素的灰度值不会发生大的变化&#xf…

《网络安全0-100》双钥加密体制

双钥加密体制 怎么说 没找着公钥加密在哪&#xff0c;所以就接着写了。 公钥加密&#xff0c;也叫非对称(密钥)加密&#xff0c;属于通信科技下的网络安全二级学科&#xff0c;指的是由对应的一对唯一性密钥(即公开密钥和私有密钥)组成的加密方法。它解决了密钥的发布和管理…

【ArcGIS】使用ArcGIS进行坡度分析

使用ArcGIS进行坡度分析 1 数据来源2 操作步骤参考 坡度是指过地表面任意一点的切平面与水平地面之间的夹角。坡度用来计算任–单元和邻域单元间变化的最大比率&#xff0c;如单元下降最陡的坡面(单元和它相邻单元间的高程距离的最大变化率)。 坡度分析是计算两相邻像元间的数值…

STM32的时钟系统(嵌入式学习)

STM32的时钟系统 时钟的基本概念时钟系统的组成时钟源晶体振荡器和RC振荡器的区别晶体振荡器RC振荡器 STM32G030时钟源时钟树STM32CubeMX时钟树配置 时钟的基本概念 时钟是指用于计量和同步时间的装置或系统。时钟是嵌入式系统的脉搏&#xff0c;处理器内核在时钟驱动下完成指…