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

news2024/11/20 9:21:54

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

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

在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/691361.html

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

相关文章

ModbusRTU协议封装,控制RJ45报警器,复制一下就能用哦~

本文只对 写保持寄存器 HoldingRegister 做操作,其他类型的寄存器方法方法也在ModbusWriteOrRead类中,可自行测试。 报警器设备型号(USB版):JD01AX07 01 设备外观及亮灯: 文档说明-部分: 注: 以下图第一个绿灯开启的二进制命令为例: 01 06:寄存器类型 00 00:…

机器学习6:使用 TensorFlow 的训练线性回归模型

纸上得来终觉浅&#xff0c;绝知此事要躬行。前面 5 篇文章介绍了机器学习相关的部分基础知识&#xff0c;在本章&#xff0c;笔者将讲解基于 TensorFlow 实现一个简单的线性回归模型&#xff0c;以便增强读者对机器学习的体感。 目录 1.环境准备 1.1 安装 Python3 1.2 安装…

MySQL 卸载与安装

卸载 先打开控制面板>>>程序>>>程序和功能 里卸载mysql的所有程序。 然后去计算机文件里查看有没有mysql文件残留的&#xff0c;全部删除。 在系统变量Path中删除mysql的路径。 再去删除服务&#xff0c;以管理员身份运行终端。 最后再去注册表里删除关于my…

搭建selenoid环境

1、拉取浏览器镜像 docker pull selenoid/vnc:chrome_103.02、拉取selenoid-ui容器镜像 docker pull aerokube/selenoid-ui:1.10.43、拉取selenoid容器镜像 docker pull aerokube/selenoid4、编写配置文件 vi /selenoid/config/browsers.json volumes可以做容器路径映射&…

【Linux 驱动篇(二)】LED 驱动开发

文章目录 一、Linux 下 LED 灯驱动原理1. 地址映射1.1 ioremap 函数1.2 iounmap 函数 2. I/O 内存访问函数2.1 读操作函数2.2 写操作函数 二、实验程序编写1. LED 灯驱动程序编写2. 编写测试 APP 三、运行测试1. 编译驱动程序和测试 APP1.1 编译驱动程序1.2 编译测试 APP 2. 运…

云端安全由繁到简,亚马逊云科技护航业务创新新局面

数字化愿景与现实存在的差距困扰着诸多企业&#xff0c;但造成这种差距的一个重要因素却一直被很多管理者所忽视&#xff0c;那就是企业未能建立应有的数字安全与合规体系。应用迭代的速度加快、数据快速膨胀、企业云原生道路上遭遇的种种困境&#xff0c;与数字安全部门有限的…

6款高质量国产软件,让你办公舒适度拉满,高效完成工作

布丁扫描——强大的文档扫描器 布丁扫描是一款可以用手机进行扫描的国产软件&#xff0c;可以快速、方便地转换纸质文件为电子文件&#xff0c;提高工作效率。 它可以将手机的摄像头用作扫描仪&#xff0c;将纸质文件、照片、证件等物品转换成数字格式的文件&#xff0c;还可对…

vue3-实战-14-管理后台-数据大屏-男女比例-年龄比例-地图以及轨迹-趋势折线图等

目录 1-男女比例【柱状图】 1.1-大屏男女比例原型需求 1.2-结构样式逻辑开发 2-年龄比例-饼图 2.1-原型需求分析 2.2-结构样式逻辑开发 3-中国地图和运行轨迹 3.1-地图组件需求原型 3.2-结构样式逻辑开发 4-未来7天游客数量趋势图-折线图 5-右侧的相关图 6-总结 1-…

数字空间-服务器应用监控系统

完整资料进入【数字空间】查看——baidu搜索"writebug" 随着各行业信息化建设的不断深入发展&#xff0c;单独的服务器已经再无法满足企业的需求。网络和应用规模日趋扩大&#xff0c;服务器网络集群大量应用于中、小型企业中&#xff0c;服务器性能监控和日常维护变…

金属元素螯合剂:(S)-DOTAGA-(COOt-Bu)4,1023889-20-4,可应用于制备纳米材料

文章关键词&#xff1a;金属元素螯合剂&#xff0c;大环配体&#xff0c;DOTA标记(COOt-Bu)4 ●中文名&#xff1a;(S)-DOTAGA-四叔丁酯 ●英文名&#xff1a;(S)-DOTAGA-(COOt-Bu)4 ●外观以及性质&#xff1a; 西安凯新生物科技有限公司供应的​(S)-DOTAGA-(COOt-Bu)4中DOT…

vue项目 ‘npm run dev‘ 报错 npm ERR! errno 134

npm ERR! errno 134 表示 npm 执行出现了致命错误&#xff0c;通常是由于内存不足或程序崩溃导致的。 这时需要我们分配更多的内存给vue-cli-service serve 解决方案 1. 安装increase-memory-limit cross-env依赖 npm install increase-memory-limit cross-env increase-mem…

Java面试题及答案整理( 2023年 6 月最新版,持续更新)

秋招金九银十快到了&#xff0c;发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全~这套互联网 Java 工程师面试题包括了&#xff1a;MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java面试、Spring、微服务、Linux、Spring…

其他品牌的触控笔能用在ipad上?好用不贵手写笔推荐

任何一种产品&#xff0c;都是有好有坏&#xff0c;就像苹果的Pencil&#xff0c;因为受到了消费者的欢迎&#xff0c;所以也推出了一些新的产品&#xff0c;比如平替电容笔&#xff0c;这些产品&#xff0c;有的质量好&#xff0c;有的价格低&#xff0c;被消费者所接受。但也…

cpu个数、核数、超线程的一些概念

cpu个数&#xff1a; 物理cpu个数&#xff1a;物理CPU数就是实际服务器中插槽上的CPU个数&#xff0c;主板上实际插入的cpu数量 逻辑cpu个数&#xff1a;物理CPU个数 * 每颗物理CPU的核数 * 超线程数 cpu核数&#xff1a; 每颗物理CPU可以有1个或者多个物理内核&#xff0c;通…

git上传文件到远程分支

1、进入文件目录&#xff08;kernel&#xff09;执行make distclean 清除配置文件 2、查看所在分支 git branch -a 3、查看远程分支 git branch -r 3、添加文件到分支 git add . git commit -m "XXXX" 4、上传文件 git push -u origin develop-camera

Spring Boot 中的 @PostMapping 注解,如何使用

Spring Boot 中的 PostMapping 注解 在 Spring Boot 中&#xff0c;我们经常需要编写 RESTful Web 服务&#xff0c;以便于客户端与服务器之间的通信。为了简化 RESTful Web 服务的开发&#xff0c;Spring Boot 提供了 PostMapping 注解&#xff0c;它可以让我们更方便地编写 …

结合uview实现倒计时

实现场景&#xff1a;试卷答题&#xff0c;点击开始考试&#xff0c;出现倒计时&#xff0c;刷新倒计时就没有了 实现思路&#xff1a; 关键点在于进来以后获取当前时间计算出结束时间 假设接口是20分钟以后倒计时结束&#xff0c;下面就算出了都是秒的时候倒计时结束了 new …

Jmeter性能压测报错address already in use:connect

目录 解决方法一&#xff1a; 解决方法二&#xff1a; 报错截图如下&#xff1a; 原因分析&#xff1a; 这个问题的原因是windows端口被耗尽了&#xff08;默认1024-5000&#xff09;&#xff0c;而且操作系统要 2~4分钟才会重新释放这些端口&#xff0c;所以可以增加window…

龙讯旷腾Q-Flow和Q-Studio新功能,在线进行材料计算

Q-Flow和Q-Studio功能升级 Q-Flow&#xff08;在线可视化提交任务工具&#xff09;以及Q-Studio&#xff08;在线建模工具&#xff09;依托Mcloud平台免费向用户开放使用。告别Linux编辑代码提交任务的模式&#xff0c;Q-Flow可在浏览器里通过拖拽图形化的第一性原理计算功能组…

【刷题笔记】牛客网:删除公共字符

1、题目描述 2、题目分析 具体思路如下&#xff1a; 预先定义String result ""作为输出结果 1、遍历str2字符串中的每个字符&#xff0c;将其存储到HashMap中&#xff08;其中key为单个字符&#xff0c;value为该字符出现的次数&#xff09; 2、遍历str1字符串中的…