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的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码 2. 详解编译…...
为摸鱼助力:一份Vue3的生成式ElementPlus表单组件
目录 一、实现背景 二、简介 三、组织架构设计 四、实现方式 五、代码示例 六、示例代码效果预览 七、项目预览地址 & 项目源码地址 目前项目还有诸多待完善的地方,大家有好的想法、建议、意见等欢迎再次评论,或于github提交Issues 一、实现…...
数通工作中常见问题与解决方法
城域网,硬件,交换机开局 1、环路产生,现象,怎么解决 一般是物理拓扑存在环路,导致数据互传,Mac地址漂移,产生环路; Cpu利用率变高,端口流量接近100%,有mac…...
基于STM32+华为云IOT设计的智能浇花系统
一、前言 随着社会的不断发展和人们生活水平的逐渐提高,人们逐渐追求高质量的生活,很多人都会选择在家里或办公室种植一些花卉以净化家庭空气,陶冶情操,但是很多人忙于工作、学习、出差、旅游或者一些其他的原因,不能及时地对花卉进行照料,短时间内导致很多花卉因缺水分…...
回调函数(callback)是什么?
通俗易懂 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。 在这个例子里,你的电话号码就叫回调函…...
零代码量化投资:用ChatGPT获取新浪财经上的股票实时行情
现在很多免费的股票数据库,比如akshare,其实是从新浪财经或者东方财富网站上爬取下来的。如果能直接从新浪财经或者东方财富网站上爬取数据,可以获取更全面更即时的信息。 可以在ChatGPT中输入提示词如下: 写一段Python代码&…...
从GitLab拉取并运行项目
从GitLab拉取并运行项目 序Git项目运行运行报错 总结教训 序 搭建好前端基础环境后,开始尝试从单位项目组拉取项目尝试本地运行。 Git Git相关配置:一篇学会Git版本管理 先申请Git账号,随后由上级分配权限拉入该项目组。 通过git clone ……...
AI绘画结合GPT 把Ai绘画与摄影玩明白
一、绘画与摄影有什么关系? 绘画和摄影是两种不同的艺术形式,它们都以其自身独特的方式捕捉和表达现实。在某些方面,它们是相互联系的,而在其他方面,它们又有所不同。 相似之处:绘画和摄影都是创造性的…...
哈工大计算机网络课程数据链路层协议详解之:多路访问控制(MAC)协议
哈工大计算机网络课程数据链路层协议详解之:多路访问控制(MAC)协议 在上一小节介绍完数据链路层功能和所提供的服务后,接下来我们介绍一个在数据链路层非常重要的一个协议:多路访问控制MAC协议。 多路访问控制主要是…...
docker基本概念和相关命令
!!! 前面都是概念东西,可以直接跳到Docker命令就可以了(直接搜吧“Docker命令”,页内无法跳转,还在研究中……) 容器和虚拟化 容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户…...
43. 间断连续登录用户问题
文章目录 题目需求思路一实现一题目来源 题目需求 现有各用户的登录记录表(login_events)如下,表中每行数据为:一个用户何时登录了平台。 现要求统计各用户最长的连续登录天数,间断一天也算作连续,例如&a…...
Visual Studio Code 编辑器实用插件简介
Visual Studio Code 编辑器插件 以下是一些常用的 Visual Studio Code 编辑器插件及其简短描述: 2gua.rainbow-brackets:在括号周围添加彩虹色的边框,以帮助区分不同层次的括号。adpyke.codesnap:将代码片段转换为漂亮的图片&am…...
微信小程序之Image那些事
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、使用场景二、使用方式1.动态读取image大小2.动态设置style3.动态赋值 总结 前言 小程序中 Image使用频率是非常高的 不同场景下 Image使用的属性也不一样 …...
【MySQL】不就是子查询
前言 今天我们来学习多表查询的下一个模块——子查询,子查询包括了标量子查询、列子查询、行子查询、表子查询,话不多说我们开始学习。 目录 前言 目录 一、子查询 1. 子查询的概念 2. 子查询语法格式 2.1 根据子查询结果不同可以分为:…...
gpt4实现对摄像头帧缓冲区图像的LAB阈值选择界面(python-opencv)
代码全是GPT4写的,我就提出Prompt和要改的地方而已。 图形界面效果 可复制阈值:(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,可以理解为stable diffusion(SD)模型的一种插件,和hyper-network,controlNet一样,都是在不修改SD模型的前提下,利用少量数据训…...
Flink 读写Kafka总结
前言 总结Flink读写Kafka Flink 版本 1.15.4 Table API 本文主要总结Table API的使用(SQL),官方文档:https://nightlies.apache.org/flink/flink-docs-release-1.17/zh/docs/connectors/table/kafka/ kerberos认证相关配置 …...
LiDAR SLAM 闭环——BoW3D论文详解
标题:BoW3D: Bag of Words for Real-Time Loop Closing in 3D LiDAR SLAM 作者:Yunge Cui,Xieyuanli Chen,Yinlong Zhang,Jiahua Dong,Qingxiao Wu,Feng Zhu 机构:中科院沈阳自动化研究所 来源:2022 RAL 现算法已经开源&#…...
Android NTP时间同步源码分析
Android NTP时间同步源码分析 Android系统设置自动时间后,如果连接了可用的网络。会同步网络时间。这个处理是 NetworkTimeUpdateService完成的。某些定制化的系统,需要禁止网络时间同步。比如仅仅使用GPS时间。基于Android9,分析一下 Andro…...
数据库之MySQL字符集与数据库操作
目录 字符集 CHRARCTER SET 与COLLATION的关联 CHRARCTER SET 定义 基础操作 查看当前MySQL Server支持的 CHARACTER SET 查看特定字符集信息(主要包含默认的COLLATION 与 MAXLEN) COLLATION 定义 COLLATION后缀 基础操作 查看MySQL Server支持的…...
Java JFreeChart 折线图X轴标签优化:5分钟搞定密集数据展示问题
Java JFreeChart折线图X轴标签优化实战:解决密集数据展示难题 在数据可视化领域,折线图是最常用的图表类型之一。但当数据量激增时,X轴标签往往会因为空间不足而显示为省略号,严重影响图表可读性。本文将深入探讨如何通过定制化方…...
从命令行工具到桌面体验:SyncTrayzor如何让Syncthing在Windows上焕然新生
从命令行工具到桌面体验:SyncTrayzor如何让Syncthing在Windows上焕然新生 【免费下载链接】SyncTrayzor Windows tray utility / filesystem watcher / launcher for Syncthing 项目地址: https://gitcode.com/gh_mirrors/sy/SyncTrayzor 你是否曾经在Window…...
Qwen3-ASR-1.7B问题解决:服务重启、音频格式兼容全攻略
Qwen3-ASR-1.7B问题解决:服务重启、音频格式兼容全攻略 1. 引言:语音识别服务的稳定性挑战 语音识别技术正在改变我们处理音频内容的方式,但在实际部署中,服务稳定性和格式兼容性常常成为绊脚石。Qwen3-ASR-1.7B作为阿里云通义千…...
OpenClaw多语言支持:百川2-13B量化模型国际化任务实践
OpenClaw多语言支持:百川2-13B量化模型国际化任务实践 1. 为什么需要多语言自动化助手 去年接手一个跨国协作项目时,我每天要处理来自五个国家的邮件、文档和会议记录。最头疼的不是时差问题,而是不同语言的文档混在一起——英文技术规范、…...
Qwen3-ASR-1.7B部署案例:高校科研组构建本地化学术讲座语音知识库
Qwen3-ASR-1.7B部署案例:高校科研组构建本地化学术讲座语音知识库 1. 项目背景与价值 高校科研团队经常举办各类学术讲座和研讨会,这些宝贵的学术内容通常以音频形式记录。传统的人工转录方式耗时耗力,且对于专业术语密集的学术内容&#x…...
gitru:一个由 Rust 打造的零依赖 Git 提交信息校验工具
gitru 基于 Git 的 commit-msg Hook 实现,用于在提交阶段自动校验提交信息格式。 在团队协作开发中,规范的 Git 提交信息是代码追溯、版本管理、自动生成变更日志的基础。 但现实往往是: 人工约束容易遗漏手动配置 Hook 繁琐提交信息格式随心…...
告别死记硬背!信息系统项目管理师(高项)思维导图活用法:从考前3个月到考前一天的全周期规划
信息系统项目管理师备考革命:用思维导图构建你的动态知识引擎 备考信息系统项目管理师(高项)的过程,常常让考生陷入两难困境:一方面要掌握庞杂的知识体系,另一方面又要应对实际工作中的时间压力。传统死记硬…...
Mac Mouse Fix 3.x升级指南:从基础增强到专业级鼠标体验的进化之路
Mac Mouse Fix 3.x升级指南:从基础增强到专业级鼠标体验的进化之路 【免费下载链接】mac-mouse-fix Mac Mouse Fix - A simple way to make your mouse better. 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 价值导向:为什么…...
为什么选择yfinance:3步实现免费金融数据获取的完整解决方案
为什么选择yfinance:3步实现免费金融数据获取的完整解决方案 【免费下载链接】yfinance Download market data from Yahoo! Finances API 项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance 在金融数据分析的世界里,你是否曾为获取高质…...
NanoPC-T6开发板实战:手把手教你制作并烧录RK3588的Recovery镜像(含完整分区解析)
NanoPC-T6开发板实战:手把手教你制作并烧录RK3588的Recovery镜像(含完整分区解析) 在嵌入式开发领域,能够独立制作和烧录Recovery镜像是一项至关重要的技能。对于使用NanoPC-T6开发板和RK3588芯片的开发者来说,掌握这一…...
