第十三章:预处理

article/2025/9/7 20:39:43

预处理功能是C语言特有的功能,可以使用预处理和具有预处理的功能是C
语言和其他高级语言的区别之一。预处理程序包含许多有用的功能,如宏定义、条件编译等,使用预处理功能便于程序的修改、阅读、移植和调试,也便于实现模块化程序设计。

通过本章的学习,您可以:

1、掌握宏定义相关内容
2、掌握文件包含相关内容
3、掌握编译相关内容

**

13.1 宏定义

**
在前边的学习中经常遇到用#define命令定义符号常量的情况,其实使用#define命令就是要定义一个可替换的宏。宏定义是预处理命令的一种,它提供了一种可以替换源代码中字符串的机制。根据宏定义是否有参数,可以将宏定义分为不带参数的宏定义和带参数的宏定义两种,下面分别进行介绍。

13.1.1 不带参数的宏定义

宏定义指令#defne 用来定义一个标识符和一个字符串,以这个标识符来代表这个字符串,在程序中每次遇到该标识符时就用所定义的字符串替换它。宏定义的作用相当于给指定的字符串起一个别名。

不带参数的宏定义一般形式如下:

#define 宏名 字符串

#表示这是一条预处理命令
宏名是一个标识符,必须符合C语言标识符的规定
字符串这里可以使常数,表达式,格式字符串等。
例如:
#define PI 3.14159
该语句的作用是在该程序中用 PI替代 3.14159,在编译预处理时,每当在源程序中遇到 PI就自动用 3.14159 代替。
使用#define 进行宏定义的好处是需要改变一个常量时只需改变#define 命令行,整个程序的常量都会改变,大大提高了程序的灵活性。
宏名要简单且意义明确,一般习惯用大写字母表示以便与变量名相区别。

注意:宏定义不是C语句,不需要在行末加分号。

宏名定义后,即可成为其他宏名定义中的一部分。例如,下面代码定义了正方形的边长、周长及面积的值。
#define SIDE 5
#define PERIMETER 4SIDE
#define AREA SIDE
SIDE

前面强调过宏替换是以串代替标识符。因此,如果希望定义一个标准的邀请语,可编写如下代码:

#define STANDARD “You are welcome to join us”
printf(STANDARD);

编译程序遇到标识符 STANDARD 时,就用"You are welcome to join us"替换。

关于不带参数的宏定义有以下几点需要强调:
1、如果在字符串中含有宏名,则不进行替换。例如:
#include<stdio.h>
#define TEST “This is an example”
main()
{
char exp[30]=“This TEST is not that TEST”;
printf(“%s\n”,exp);
printf(“%s\n”,TEST);
}
该段代码输入结果如图 13.1 所示,
在这里插入图片描述

注意上面程序字符串中的TEST并没有用"this isan example"来替换,因此如果串中含有宏名,则不进行替换、

2、如果串长于一行,可以在该行末尾用一反斜杠“\”续行。

3、#define 命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到此源文件结束。

注意:在编写程序时通常将所有的#detine放到文件的开始处或独立的文件中,而不是将它们分散到整个程序中。
4、可以用#undef命令终止宏定义的作用域。
例如:
#define<stdio.h>
#define TEST “This is an example”
main()
{
printf(TEST);
#undef TEST


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

相关文章

9.4 Q1|复旦大学CHARLS发文 | 老年人肌肉减少症和轻度认知障碍

1.第一段-文章基本信息 文章题目&#xff1a;Sarcopenia and mild cognitive impairment among elderly adults: The first longitudinal evidence from CHARLS 中文标题&#xff1a;老年人肌肉减少症和轻度认知障碍&#xff1a;来自CHARLS 的第一个纵向证据 发表杂志&#x…

python h5py 读取mat文件的<HDF5 object reference> 问题

我用python加载matlab的mat文件 mat文件&#xff1a; 加载方式&#xff1a; mat_file h5py.File(base_dir str(N) _nodes_dataset_snr- str(snr) _M_ str(M) .mat, r) Signals mat_file["Signals"][()] Tp mat_file["Tp"][()] Tp_list mat_fil…

【数据结构】图论核心算法解析:深度优先搜索(DFS)的纵深遍历与生成树实战指南​

深度优先搜索 导读&#xff1a;从广度到深度&#xff0c;探索图的遍历奥秘一、深度优先搜索二、算法思路三、算法逻辑四、算法评价五、深度优先生成树六、有向图与无向图结语&#xff1a;深潜与回溯&#xff0c;揭开图论世界的另一面 导读&#xff1a;从广度到深度&#xff0c;…

扫地机产品异物进入吸尘口堵塞异常检测方案

扫地机产品异物进入吸尘口堵塞异常的检测方案 文章目录 扫地机产品异物进入吸尘口堵塞异常的检测方案一.背景二.石头的音频异常检测的方案2.1 音频检测触发点2.1.1时间周期2.1.2根据清洁机器人清扫模式或清扫区域污渍类型,即当清扫模式为深度清洁模式 或清扫区域污渍类型为重度…

【Mini-F5265-OB开发板试用测评】RT-Thread的移植(调通串口+LED)

前言 近期&#xff0c;笔者有幸获得灵动微MM32F5265开发板的体验资格。MM32F5260搭载了arm china "Star-MC1 内核"处理器&#xff0c;拥有高性能&#xff0c;主打家电和工业等高可靠性应用领域。 总结一下&#xff0c;有以下亮点&#xff1a; 本土团队打造&#x…

MySQL8.4组复制

https://dev.mysql.com/doc/refman/8.4/en/group-replication.html 1 什么是组复制 组复制主要解决了传统异步复制主机宕机时可能造成主从节点数据不一致问题MySQL Group Replication&#xff0c;简称MGR将原有的gtid复制功能进行可增强&#xff0c;支持单主模式和多主模式组复…

【笔记】Trae+Andrioid Studio+Kotlin开发安卓WebView应用

文章目录 简介依赖步骤AS(Andriod Studio)创建项目AS创建虚拟机TRAE CN 修改项目新增按键捕获功能 新增WebViewWebView加载本地资源在按键回调中向WebView注入JS代码 最终关键代码吐槽 简介 使用Trae配合Andriod Studio开发一个内嵌WebView的安卓应用, 在WebView中加载本地资源…

kibana解析Excel文件,生成mapping es导入Excel

一、Excel转为CSV格式 在线免费网站&#xff1a;EXCEL转CSV - 免费在线将EXCEL文件转换成CSV (cdkm.com) 二、登录kibana 点击左边菜单栏找到Machine Learning&#xff0c; 进入后上面菜单选择Data Visualizer&#xff0c;然后上穿转好的csv格式的Excel 点击导入输入建立的m…

4d毫米波雷达开源算法4DRadarSLAM运行

1.开源代码和论文 &#xff08;1&#xff09;论文名称&#xff1a; 4DRadarSLAM: A 4D Imaging Radar SLAM System for Large-scale Environments based on Pose Graph Optimization &#xff08;2&#xff09;开源代码国内下载地址 https://gitcode.com/gh_mirrors/4d/4DRada…

安卓手机照片在这个目录/storage/emulated/999/DCIM/Camera下的导出解决方案

这里写自定义目录标题 背景解决方案导出过程 导出的成功照片展示 背景 想导出手机的相册照片,发现部分照片无法导出 &#xff0c;原因是在文件管理根本找不到这个目录/storage/emulated/999/DCIM/ 。 照片位置截图&#xff1a; 对应的安卓手机的文件管理截图如下 发现没有…

C++进阶--C++11(04)

文章目录 C进阶--C11&#xff08;04&#xff09;lambdalambda表达式语法捕捉列表lambda的应用lambda的原理 包装器functionbind 总结结语 很高兴和大家见面&#xff0c;给生活加点impetus&#xff01;&#xff01;开启今天的编程之路&#xff01;&#xff01; 今天我们进一步c…

动态设置微信小程序页面标题(navigationBarTitleText属性)

前言&#xff1a; 最近在公司进行小程序研发的时候&#xff0c;产品给出了一个动态加载页面标题的需求&#xff0c;经过调研之后将结果在这里与各位伙伴进行分享。 代码展示&#xff1a; 在.json文件中进行初始配置&#xff1a; { "usingComponents": {}, &q…

PostgreSQL数据库配置SSL操作说明书

背景&#xff1a; 因为postgresql或者mysql目前通过docker安装&#xff0c;只需要输入主机IP、用户名、密码即可访问成功&#xff0c;这样其实是不安全的&#xff0c;可能会通过一些手段获取到用户名密码导致数据被窃取。而ES、kafka等也是通过用户名/密码方式连接&#xff0c;…

基于python 将图像上同一行距离相近的矩形框融合

import os import cv2 import numpy as npdef get_files(path):""" 获取指定路径下所有文件名称 """files []for filename in os.listdir(path):if os.path.isfile(os.path.join(path, filename)):files.append(filename)return filesdef split…

拉取gitlab项目

一、下载nvm管理node 先下载配置好nvm,再用nvm下载node 下载链接&#xff1a;开始 下载nvm - nvm中文官网 情况&#xff1a;npm i 下载依赖缓慢&#xff0c;可能是node版本不对&#xff0c;可能node版本太高 可能得问题&#xff1a;使用nvm 下载低版本的node时&#xff0c;…

Opencv4 c++ 自用笔记 01 Mat类

Mat类 Mat类用来保存矩阵类型的数据&#xff0c;包括向量、矩阵、灰度、通道数。主要分为两部分&#xff0c;矩阵头和矩阵指针。 &#xff08;单通道为灰度图像&#xff0c;3通道或4通道为彩色图像&#xff09; 矩阵头中包含矩阵形状、存储方法、地址、引用次数等。矩阵指针…

Linux `|` 管道符与 `grep` 命令深度解析与高阶应用指南

Linux `|` 管道符与 `grep` 命令深度解析与高阶应用指南 一、核心机制深度解析1. 管道符 `|` 的底层原理2. grep 的匹配引擎二、高阶组合应用技巧1. 多级过滤管道2. 实时监控与告警3. 结构化数据处理三、企业级应用场景1. 安全审计系统2. 性能监控告警3. 日志关联分析四、性能优…

STP配置

由于我们演示的是STP 但是华为交换机默认的都是MSTP所以要换到STP以下是方法 STP mode &#xff1f; 查看模式 STP mode stp 选择stp 换好了后配置交换机优先级 [SWA]stp priority 4096 Apr 15 2013 16:15:33-08:00 SWA DS/4/DATASYNC_CFGCHANGE:OID 1.3.6.1.4.1.2011.5…

CentOS_7.9 2U物理服务器上部署系统简易操作步骤

近期单位网站革新&#xff0c;鉴于安全加固&#xff0c;计划将原有Windows环境更新到Linux-CentOS 7.9&#xff0c;这版本也没的说&#xff08;绝&#xff09;了&#xff08;版&#xff09;官方停止更新&#xff0c;但无论如何还是被sisi的牵挂着这一大批人&#xff0c;毕竟从接…

《仿盒马》app开发技术分享-- 订单详情页(端云一体)

开发准备 在之前的章节中我们实现了订单的提交&#xff0c;以及提交之后跳转到确认订单页面&#xff0c;在确认订单页面我们添加了一个入口&#xff0c;这个入口是查询订单&#xff0c;当我们点击入口时&#xff0c;我们需要跳转到一个新的界面&#xff0c;这个界面通过接收上…