初学c语言22(编译和链接)

article/2025/8/3 11:22:00

一.翻译环境和运行环境

在ANSIC的任何一种实现中存在俩个不同的环境,分别为翻译环境和运行环境,翻译环境中源代码转化为可执行的机器指令(二进制指令),执行环境执行代码

1.翻译环境

翻译环境分为编译和链接,而编译又分为预处理、编译、汇编三个过程

二.预处理详解

预处理阶段主要处理的是源文件#开始的预编译指令,规则如下:

• 将所有的 #define 删除,并展开所有的宏定义。

• 处理所有的条件编译指令,如: #if 、 #ifdef 、 #elif 、 #else 、 #endif 。

• 处理#include预编译指令,将包含的头⽂件的内容插⼊到该预编译指令的位置。这个过程是递归进 ⾏的,也就是说被包含的头⽂件也可能包含其他⽂件。

• 删除所有的注释

• 添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等。

• 保留所有的 #pragma 的编译器指令,编译器后续会使⽤。

1.预定义符号

#include <stdio.h>int main()
{printf("%s\n", __FILE__); //进行编译的源文件printf("%d\n", __LINE__); //文件当前的行号printf("%s\n", __DATE__); //文件编译的日期printf("%s\n", __TIME__); //文件编译的时间return 0;
}

结果:

2.#define定义常量

语法:

3.#define定义宏

语法:

举例:

但这个代码存在问题:

所以得这么写:

4.宏和函数的对比

5.#运算符

功能:将一个参数转化为字符串字面量(仅能出现在带参数宏的替换链列表里)

补充:

举例:

6.##运算符

功能:将位于俩边的合成一个符号

举例:

7.#undef

功能:移除一个宏定义(与#define 对偶)

8.条件编译

功能:可以选择性编译

 1.#if  
常量表达式
//... 为真就执行编译#endif//
常量表达式由预处理器求值。如:
#define __DEBUG__ 1#if __DEBUG__//..#endif2.
多个分⽀的条件编译
#if 
常量表达式
//...#elif 
常量表达式
//...#else//...3.
判断是否被定义
#if defined(symbol)#ifdef symbol#if !defined(symbol)#ifndef symbol
4.
嵌套指令
#if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif
#elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif
#endif

9.头文件的包含

分为本地文件包含(如之前扫雷游戏中#include "game.h")和  库文件包含(如#include <stdio.h>)

查找策略:先在源⽂件所在⽬录下查找,如果该头⽂件未找到,编译器就像查找库函数头⽂件⼀样在标准位置查 找头⽂件。 如果找不到就提⽰编译错误

10.嵌套文件包含

由于头文件可能重复包含,如果工程较大会导致预处理阶段插入大量重复代码,编译压力大

有如下解决方案:

1.在每个头文件开头加上如下代码:

#ifndef __TEST_H__
#define __TEST_H__
//头⽂件的内容
#endif  

或:

#pragma once


http://www.hkcw.cn/article/ubgJvMfBnb.shtml

相关文章

什么是缺页中断(缺页中断详解)

文章目录 【操作系统】什么是缺页中断&#xff08;缺页中断详解&#xff09;一、缺页中断的本质与背景1. **虚拟内存与分页机制**2. **缺页中断的定义** 二、缺页中断的触发场景1. **首次访问新分配的虚拟页**2. **内存置换导致的页缺失**3. **访问权限冲突**4. **页表项无效**…

2025——》VSCode Windows 最新安装指南/VSCode安装完成后如何验证是否成功?2025最新VSCode安装配置全攻略

1.VSCode Windows 最新安装指南: 以下是 2025 年 Windows 系统下安装 Visual Studio Code(VSCode)的最新指南,结合官方文档与实际操作经验整理而成: 一、下载官方安装包: 1.访问官网: 打开浏览器,进入 VSCode 官方下载页面https://code.visualstudio.com/Download 2…

终结电源反接与压降损耗:理想二极管控制器深度解析

理想二极管控制器驱动外部 NMOS实现超低正向压降和可防反向电流特性&#xff0c;广泛应用在有大电流高功率、电源输入防反需求场景中。那理想二极管控制IC内部到底是怎么工作的&#xff0c;怎么实现这些特性的呢&#xff1f;本文以LM74700-Q1为例介绍尝试解答上述问题。 一 理…

开源版 PyMOL 如何绘制 新冠病毒 分子结构?

参阅&#xff1a;用生物知识解读“新冠病毒”&#xff0c; 百度网盘下载 提取码&#xff1a;csub pip show pymol 简介: PyMOL是一个Python增强的分子图形工具。它擅长蛋白质、小分子、密度、表面和轨迹的3D可视化。它还包括分子编辑、射线追踪和动画。 先从 www.python.org…

PyTorch——DataLoader的使用

batch_size, drop_last 的用法 shuffle shuffleTrue 各批次训练的图像不一样 shuffleFalse 在第156step顺序一致

【前端】CSS面试八股

网上现有资料已经很丰富了&#xff0c;我挑了些自己押面试题时总结过的来写。 Q&#xff1a;回流和重绘 A&#xff1a; 回流reflow&#xff1a;计算元素的几何&#xff0c;引发layout重绘repaint&#xff1a;更新元素可见样式&#xff0c;引发paint 回流的成本比重绘高得多&…

【笔记】在 MSYS2(MINGW64)中安装 python-maturin 的记录

#工作记录 &#x1f4cc; 安装背景 操作系统&#xff1a;MSYS2 MINGW64当前时间&#xff1a;2025年6月1日Python 版本&#xff1a;3.12&#xff08;通过 pacman 安装&#xff09;目标工具&#xff1a;maturin —— 用于构建和发布 Rust 编写的 Python 包 &#x1f6e0;️ 安装…

华为IP(7)

端口隔离技术 产生的背景 1.以太交换网络中为了实现报文之间的二层隔离&#xff0c;用户通常将不同的端口加入不同的VLAN&#xff0c;实现二层广播域的隔离。 2.大型网络中&#xff0c;业务需求种类繁多&#xff0c;只通过VLAN实现二层隔离&#xff0c;会浪费有限的VLAN资源…

JS基础内容1

JS基础内容1目录 打印方式关联方式延迟加载变量声明数组对象补充&#xff1a;json格式 函数函数的分类函数在对象和数组中的使用函数的交互调用 打印方式 1、弹窗打印 alert(arr) 2、控制台打印 console.log() 以 html 的形式打印 console.dir() 将 document 当成 对象 打印 …

高考报名人数8年来首降背后 教育需求变化探因

教育部近日公布,今年高考报名人数为1335万人,比去年的1342万略微下降7万人,这是自2018年以来首次出现下降。2025年高考考生主要对应的是2006年和2007年的新生儿。2007年出生人口数量为1594万,比2006年增长了10万,但为何考生数量会下降呢?这不能简单以数字对比来解释。例如…

数据库安全性

一、计算机安全性概论 &#xff08;一&#xff09;核心概念 数据库安全性&#xff1a;保护数据库免受非法使用导致的数据泄露、更改或破坏&#xff0c;是衡量数据库系统的关键指标之一&#xff0c;与计算机系统安全性相互关联。计算机系统安全性&#xff1a;通过各类安全保护…

【C++】string类

1. 标准库中的string类 1.1 string类 string类的文档介绍 在 使用 string 类时&#xff0c;必须包含 #include 头文件以及 using namespace std ; 1.2 auto和范围for auto 关键字 在早期C/C 中 auto 的含义是&#xff1a;使用 auto 修饰的变量&#xff0c;是具有自动存储器…

Docker 在云环境中的部署:AWS/ECS 与 Azure/AKS 的实践对比

Docker 容器的出现极大地提升了应用程序的打包、交付和运行效率。然而,在面对高并发、高可用和大规模集群管理的生产环境时,将 Docker 容器部署到公有云平台成为了必然选择。公有云平台提供了强大的基础设施和托管服务,极大地简化了底层运维负担。 在众多云服务提供商中,A…

【HarmonyOS 5】Laya游戏如何鸿蒙构建发布详解

【HarmonyOS 5】Laya游戏如何鸿蒙构建发布详解 一、前言 LayaAir引擎是国内最强大的全平台引擎之一&#xff0c;当年H5小游戏火的时候&#xff0c;腾讯入股了腊鸭。我还在游戏公司的时候&#xff0c;17年曾经开发使用腊鸭的H5小游戏&#xff0c;很怀念当年和腊鸭同事一起解决…

理解解释器架构:原理、组成与运行机制全解析

目录 前言1. 什么是解释器架构2. 解释器的基本组成2.1 被解释执行的程序2.2 解释器引擎2.3 解释器内部状态2.4 程序执行的当前状态2.5 存储器模型 3. 解释器的工作原理3.1 解析源代码3.2 初始化运行环境3.3 逐条执行语法结构3.4 维护程序状态3.5 内存管理与变量作用域 4. 举例&…

SOD-123和SOD-123FL封装到底有什么区别?

目录 1. 封装结构与尺寸 2. 热性能 3. 电气特性 4. 应用场景 5. 兼容性与替代性 6.价格比较 大家好&#xff0c;我们硬件工程师经常用到SOD-123和SOD-123FL的封装&#xff0c;特别是二极管&#xff0c;比如二极管1N4007便有这两种封装。那么这两种封装两者到底有什么区别…

Apache IoTDB V2.0.3 发布|新增元数据导入导出脚本适配表模型功能

Release Announcement Version 2.0.3 Apache IoTDB V2.0.3 已经发布&#xff01; V2.0.3 作为树表双模型正式版本&#xff0c;主要新增元数据导入导出脚本适配表模型、Spark 生态集成&#xff08;表模型&#xff09;、AINode 返回结果新增时间戳&#xff0c;表模型新增部分聚…

NX753NX756美光科技闪存NX784NX785

技术解读与产品特性 美光科技的NX系列闪存&#xff0c;包括NX753、NX756、NX784、NX785等型号&#xff0c;代表了当前存储技术的前沿水平。这些产品基于先进的NAND闪存技术&#xff0c;采用业界领先的3D TLC NAND技术&#xff0c;实现了高速的数据读写能力。3D TLC NAND技术通…

go语言的GMP(基础)

1.概念梳理 1.1线程 通常语义中的线程&#xff0c;指的是内核级线程&#xff0c;核心点如下&#xff1a; &#xff08;1&#xff09;是操作系统最小调度单元&#xff1b; &#xff08;2&#xff09;创建、销毁、调度交由内核完成&#xff0c;cpu 需完成用户态与内核态间的切…

Docker容器创建Redis主从集群

利用虚拟机中的三个Docker容器创建主从集群&#xff0c;容器信息&#xff1a; 容器名角色IP映射端口r1master192.168.150.1017001r2slave192.168.150.1017002r3slave192.168.150.1017003 启动多个redis实例 新建一个docker-compose文件来构建主从集群&#xff1a; 文件内容&…