当前位置: 首页 > news >正文

C语言程序环境和预处理

在这里插入图片描述

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

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

在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函数;也有可能是意外终止

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

相关文章:

C语言程序环境和预处理

本章主要以图片和文字的形式给大家讲解 程序的翻译环境和程序的执行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境&#xff0c;它用于实际执行代码 2. 详解编译…...

为摸鱼助力:一份Vue3的生成式ElementPlus表单组件

目录 一、实现背景 二、简介 三、组织架构设计 四、实现方式 五、代码示例 六、示例代码效果预览 七、项目预览地址 & 项目源码地址 目前项目还有诸多待完善的地方&#xff0c;大家有好的想法、建议、意见等欢迎再次评论&#xff0c;或于github提交Issues 一、实现…...

数通工作中常见问题与解决方法

城域网&#xff0c;硬件&#xff0c;交换机开局 1、环路产生&#xff0c;现象&#xff0c;怎么解决 一般是物理拓扑存在环路&#xff0c;导致数据互传&#xff0c;Mac地址漂移&#xff0c;产生环路&#xff1b; Cpu利用率变高&#xff0c;端口流量接近100%&#xff0c;有mac…...

基于STM32+华为云IOT设计的智能浇花系统

一、前言 随着社会的不断发展和人们生活水平的逐渐提高,人们逐渐追求高质量的生活,很多人都会选择在家里或办公室种植一些花卉以净化家庭空气,陶冶情操,但是很多人忙于工作、学习、出差、旅游或者一些其他的原因,不能及时地对花卉进行照料,短时间内导致很多花卉因缺水分…...

回调函数(callback)是什么?

通俗易懂 你到一个商店买东西&#xff0c;刚好你要的东西没有货&#xff0c;于是你在店员那里留下了你的电话&#xff0c;过了几天店里有货了&#xff0c;店员就打了你的电话&#xff0c;然后你接到电话后就到店里去取了货。 在这个例子里&#xff0c;你的电话号码就叫回调函…...

零代码量化投资:用ChatGPT获取新浪财经上的股票实时行情

现在很多免费的股票数据库&#xff0c;比如akshare&#xff0c;其实是从新浪财经或者东方财富网站上爬取下来的。如果能直接从新浪财经或者东方财富网站上爬取数据&#xff0c;可以获取更全面更即时的信息。 可以在ChatGPT中输入提示词如下&#xff1a; 写一段Python代码&…...

从GitLab拉取并运行项目

从GitLab拉取并运行项目 序Git项目运行运行报错 总结教训 序 搭建好前端基础环境后&#xff0c;开始尝试从单位项目组拉取项目尝试本地运行。 Git Git相关配置&#xff1a;一篇学会Git版本管理 先申请Git账号&#xff0c;随后由上级分配权限拉入该项目组。 通过git clone ……...

AI绘画结合GPT 把Ai绘画与摄影玩明白

一、绘画与摄影有什么关系&#xff1f; 绘画和摄影是两种不同的艺术形式&#xff0c;它们都以其自身独特的方式捕捉和表达现实。在某些方面&#xff0c;它们是相互联系的&#xff0c;而在其他方面&#xff0c;它们又有所不同。​ 相似之处&#xff1a;绘画和摄影都是创造性的…...

哈工大计算机网络课程数据链路层协议详解之:多路访问控制(MAC)协议

哈工大计算机网络课程数据链路层协议详解之&#xff1a;多路访问控制&#xff08;MAC&#xff09;协议 在上一小节介绍完数据链路层功能和所提供的服务后&#xff0c;接下来我们介绍一个在数据链路层非常重要的一个协议&#xff1a;多路访问控制MAC协议。 多路访问控制主要是…...

docker基本概念和相关命令

!!! 前面都是概念东西&#xff0c;可以直接跳到Docker命令就可以了(直接搜吧“Docker命令”&#xff0c;页内无法跳转&#xff0c;还在研究中……) 容器和虚拟化 容器包含应用和其所有的依赖包&#xff0c;但是与其他容器共享内核。容器在宿主机操作系统中&#xff0c;在用户…...

43. 间断连续登录用户问题

文章目录 题目需求思路一实现一题目来源 题目需求 现有各用户的登录记录表&#xff08;login_events&#xff09;如下&#xff0c;表中每行数据为&#xff1a;一个用户何时登录了平台。 现要求统计各用户最长的连续登录天数&#xff0c;间断一天也算作连续&#xff0c;例如&a…...

Visual Studio Code 编辑器实用插件简介

Visual Studio Code 编辑器插件 以下是一些常用的 Visual Studio Code 编辑器插件及其简短描述&#xff1a; 2gua.rainbow-brackets&#xff1a;在括号周围添加彩虹色的边框&#xff0c;以帮助区分不同层次的括号。adpyke.codesnap&#xff1a;将代码片段转换为漂亮的图片&am…...

微信小程序之Image那些事

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、使用场景二、使用方式1.动态读取image大小2.动态设置style3.动态赋值 总结 前言 小程序中 Image使用频率是非常高的 不同场景下 Image使用的属性也不一样 …...

【MySQL】不就是子查询

前言 今天我们来学习多表查询的下一个模块——子查询&#xff0c;子查询包括了标量子查询、列子查询、行子查询、表子查询&#xff0c;话不多说我们开始学习。 目录 前言 目录 一、子查询 1. 子查询的概念 2. 子查询语法格式 2.1 根据子查询结果不同可以分为&#xff1a;…...

gpt4实现对摄像头帧缓冲区图像的LAB阈值选择界面(python-opencv)

代码全是GPT4写的&#xff0c;我就提出Prompt和要改的地方而已。 图形界面效果 可复制阈值&#xff1a;(xxx, xxx, xxx, xxx, xxx, xxx) 代码 import cv2 import numpy as np import time from tkinter import * from PIL import Image, ImageTk import pyperclip # new# G…...

Stable Diffusion WebUI 集成 LoRA模型,给自己做一张壁纸 Ubuntu22.04 rtx2060 6G

LoRA概念 LoRA的全称是LoRA: Low-Rank Adaptation of Large Language Models&#xff0c;可以理解为stable diffusion&#xff08;SD)模型的一种插件&#xff0c;和hyper-network&#xff0c;controlNet一样&#xff0c;都是在不修改SD模型的前提下&#xff0c;利用少量数据训…...

Flink 读写Kafka总结

前言 总结Flink读写Kafka Flink 版本 1.15.4 Table API 本文主要总结Table API的使用&#xff08;SQL&#xff09;&#xff0c;官方文档&#xff1a;https://nightlies.apache.org/flink/flink-docs-release-1.17/zh/docs/connectors/table/kafka/ kerberos认证相关配置 …...

LiDAR SLAM 闭环——BoW3D论文详解

标题&#xff1a;BoW3D: Bag of Words for Real-Time Loop Closing in 3D LiDAR SLAM 作者&#xff1a;Yunge Cui,Xieyuanli Chen,Yinlong Zhang,Jiahua Dong,Qingxiao Wu,Feng Zhu 机构&#xff1a;中科院沈阳自动化研究所 来源&#xff1a;2022 RAL 现算法已经开源&#…...

Android NTP时间同步源码分析

Android NTP时间同步源码分析 Android系统设置自动时间后&#xff0c;如果连接了可用的网络。会同步网络时间。这个处理是 NetworkTimeUpdateService完成的。某些定制化的系统&#xff0c;需要禁止网络时间同步。比如仅仅使用GPS时间。基于Android9&#xff0c;分析一下 Andro…...

数据库之MySQL字符集与数据库操作

目录 字符集 CHRARCTER SET 与COLLATION的关联 CHRARCTER SET 定义 基础操作 查看当前MySQL Server支持的 CHARACTER SET 查看特定字符集信息&#xff08;主要包含默认的COLLATION 与 MAXLEN&#xff09; COLLATION 定义 COLLATION后缀 基础操作 查看MySQL Server支持的…...

搜索引擎概念解析

搜索引擎概念解析 什么是搜索引擎 MySQL搜索引擎举例 搜索引擎是一种用于在互联网上搜索并呈现相关信息的工具。它通过自动扫描和索引大量网页内容&#xff0c;并根据用户提供的关键词或查询条件&#xff0c;返回与之相关的网页链接和摘要。 当用户在搜索引擎中输入关键词或…...

网页链接投票链接步骤公众号投票链接制作制作投票

大家在选择投票小程序之前&#xff0c;可以先梳理一下自己的投票评选活动是哪种类型&#xff0c;目前有匿名投票、图文投票、视频投票、赛事征集投票等。 我们现在要以“笛乐悠扬”为主题进行一次投票活动&#xff0c;我们可以在在微信小程序搜索&#xff0c;“活动星”投票小程…...

【通信安全CACE-管理类基础级】第7章 安全运维

资源 中国通信企业协会网络安全人员能力认证考试知识点大纲 中国通信企业协会网络安全人员能力认证管理类基础级考试课件 中国通信企业协会网络安全人员能力认证考试管理类基础级复习资料 中国通信企业协会网络安全人员能力认证考试管理类基础级模拟题 系列文章 【通信安全CAC…...

随手笔记——将ROS图像话题转为OpenCV图像格式处理后再转为ROS图像话题发布(Python版)

随手笔记——将ROS图像话题转为OpenCV图像格式处理后再转为ROS图像话题发布&#xff08;Python版&#xff09; 说明关键函数代码 说明 将ROS图像话题转为OpenCV图像格式处理后再转为ROS图像话题发布&#xff0c;主要通过CvBridge的cv2_to_imgmsg和imgmsg_to_cv2函数&#xff0…...

Win11系统如何安装Oracle数据库(超级详细)

前言&#xff1a;在我们安装Oracle之前我们得理解Oracle数据库的优点是什么&#xff1a; Oracle是一个功能强大、可扩展和全面的数据库平台&#xff0c;具有广泛的功能和企业级能力&#xff0c;适用于处理复杂的企业级应用和大型数据集。 目录 一.下载Oracle数据库软件&…...

【代理服务器】Squid 反向代理与Nginx缓存代理

目录 一、Squid 反向代理1.1工作机制1.2反向代理实验1.3清空iptables规则&#xff0c;关闭防火墙1.4验证 二、使用Nginx做反向代理缓存服务器三CDN简介3.1什么是CDN3.1CDN工作原理 一、Squid 反向代理 如果 Squid 反向代理服务器中缓存了该请求的资源&#xff0c;则将该请求的…...

目标检测之遮挡物体检测

一、遮挡的类别 类内遮挡&#xff0c;目标被同一类别的目标遮挡类间遮挡&#xff0c;目标被其它类别的目标遮挡 二、解决方法 数据标注 精调遮挡目标的GT边界框 数据增强 cutout&#xff1a;在训练时&#xff0c;随机mask目标&#xff0c;提升模型对遮挡的应对能力mosaic…...

Vim 命令大全

文章目录 Vim 命令大全移动光标编辑文本查找和替换保存和退出打开多个文件&#xff1a;在文件之间切换&#xff1a;打开新窗口切换窗口其他常用命令 Vim 命令大全 移动光标 h: 左移光标j: 下移光标k: 上移光标l: 右移光标0: 移动光标到行首$: 移动光标到行末G: 移动光标到文件…...

【Visual Studio】printf() 函数无输出显示问题。使用 C++ 语言,配合 Qt 开发串口通信界面

使用 C 语言&#xff0c;配合 Qt 开发串口通信界面时&#xff0c;遇到 printf() 函数无输出显示。 在工程属性的对应位置添加 editbin /SUBSYSTEM:CONSOLE $(OUTDIR)\$(ProjectName).exe 即可&#xff0c;如下图所示。 成功运行的截图如下&#xff1a; Ref. Visual Studio 20…...

Linux安装配置Oracle+plsql安装配置(详细)

如果觉得本文不够详细&#xff0c;没有效果图&#xff0c;可移步详细版&#xff1a; Linux安装配置Oracleplsql安装配置&#xff08;超详细&#xff09;_超爱慢的博客-CSDN博客 目录 1.安装虚拟机系统 1.安装虚拟机 2.配置虚拟机 1.设置机器名 2.修改域名映射 3.固定IP…...