第十七章 联合体和枚举第十八章 动态内存管理第十九章 文件操作第二十章编译和链接文章目录前言一、预处理是什么二、使用1.预处理符号2.#define定义常量3.#define定义宏4.宏替换的规则5.宏函数的对比6.#和##总结前言随着嵌入式开发和系统编程的不断发展C语言这门基础语言也越来越重要很多人都开始学习C语言本文就介绍了C语言预处理的核心内容。一、预处理是什么预处理是C语言编译过程中的第一阶段它在编译器正式编译之前对源代码进行文本层面的处理。预处理指令以#开头主要包括宏定义、文件包含、条件编译等。二、使用1.预处理符号c语言设置了一些预处理符号是可以直接使用的例如__FILE__//进行编译的源文件__LINE__//文件当前的行号__DATE__//文件被编译的日期__TIME__//文件被编译的时间__STDC__//如果编译器遵循ANSI C其值为1否则未定义2.#define定义常量有时候我们会遇到需要反复使用某个值的场景为了方便我们可以把它定义为常量。基本语法为#define name stuff#defineMAX1000//定义常量MAX 1000#defineregregister//为register这个关键字//创建一个简短的名字#definedo_foreverwhile(1)//用更形象的符号替换实现#defineCASEbreak;case//写case语句的时候自动把// break加上//如果stuff过长可以在每行后面加上反斜杠分成几行写#defineDEBUG_PRINTprintf(file:%s\tline:%d\t\ date%s\ttime:%s\n,\__FILE__,__LINE__,\__DATE__,__TIME__)在用define定义的时候最好不要再后面加上分号否则在某些语句下面可能会出现错误。例如#defineMAX1000;if(...)maxMAX;这里因为没有大括号的时候if后面只能用一条语句如果有两条就会报错。3.#define定义宏#define还可以把参数替换到文本中这种实现通常称为宏。#define name(parament-list) stuff其中parament-list是 一个由逗号隔开的符号表它们可能出现在stuff中。参数的左括号必须要与name紧邻如果之间有空白存在参数列表就会把这个解释为stuff的一部分。例子#defineSQUARE(x)x*x这个宏接收参数x如果你把SQUARE5放置在程序中预处理器就会把他替换成表达式5*5但是这个宏存在问题inta5;SQUARE(a1);我们这里想着的是把6传进去但是实际上替换之后得到的是a1*a1运算的顺序变了所以正确的写法应该是在后面的宏定义加上括号这样就能达到我们想要的效果。#define SQUARE(x) (x)*(x)还有一种宏定义会出现问题#defineDOUBLE(x)(x)(x)inta5;intnum10*DOUBLE(a)这里我们预期的结果是100但是运行之后发现输出结果是55我们把它替换后发现得到的代码是10*55运算顺序是乘法先算为了解决这个问题我们要在外面再加一个括号。#define DOUBLE(x) ((x)(x))通过上面的例子我们可以得出结论对于数值表达式进行求值的宏定义都应该加上括号以避免运算的时候参数中的操作符或者临近操作符之间不可预料的相互作用。某些宏参数还会带有副作用如果宏参数在宏定义中出现超过一次并且宏参数带有副作用那么在使用宏的时候就可能出现危险导致不可预测的后果。副作用是参数求值的时候出现的永久性效果。#defineMAX(a,b)((a)(b)?(a):(b))x4;y5;zMAX(x,y);这里整体替换如下z ((x)(y)?(x):(y));此时x等于5y等于7z等于6并不能得到我们想要的结果如果想要得到正确的结果我们只需要把x和y改成1即可就没有副作用了。4.宏替换的规则在程序中扩展#define定义符号和宏的时候需要涉及几个步骤1.在调用宏的时候首先对参数进行检查查看是否包含任何由#define定义的符号如果有就仙贝替换。2.替换文本插入到程序原来文本的位置对于宏参数名被他们的值所替换。3。最后再次对结果文件进行扫描查看是否包含由#define定义的符号如果有则重复上面的过程。注意1.宏参数和#define定义中可以出现其他由#define定义的符号但是对于宏不能出现递归。2.当预处理器搜索#define定义的符号的时候字符串常量的内容不被搜索。5.宏函数的对比宏通常由于执行简单的运算比如在两个数中找到一个更大的数。对比函数来说宏在程序的规模和速度方面会更胜一筹而且宏参数与类型无关而函数需要在类型合适的表达式中使用。当然宏也有他的弊端1.使用宏的时候如果宏很长就会大幅度增加程序的长度。2.宏无法调试3.宏由于类型无关因此也不够严谨4.宏会带来运算符优先级的问题下面是宏与函数的对比表格对比项宏函数代码长度每次使用时都会插入宏代码可能使程序变长函数代码只保存一份每次调用只增加调用开销执行速度预处理时直接替换无调用开销速度更快有函数调用和返回的开销速度稍慢操作符优先级容易因缺少括号产生优先级问题函数参数在调用时求值优先级由函数内部决定参数类型与类型无关任何类型都可传入需要与函数参数类型匹配副作用参数可能被多次求值产生不可预测的副作用参数只在调用时求值一次无副作用问题调试宏在预处理阶段已替换无法调试函数可以设置断点方便调试递归宏不能递归函数支持递归6.#和###运算符能将宏参数转化成字符串的字面量仅允许出现在带参数的宏的替换列表中。#运算符所执行的操作可以理解为“字符串化”。假如我们有一个变量a10当我们想要打印出“the value of a is 10.”我们就可以这样写#define PRINT(n) printf(“the value of”#nis %d.,n)当我们调用PRINTa的时候就会把n替换成a#n替换成#a就转换成“a”##可以把位于两边的符号合成一个符号被称为记号粘连。但是这个东西基本上用不到。最多是在宏定义生成函数的时候通过##生成函数名。例如#defineGENERIC_MAX(type)type type##_max(type x,type y){return(xy?x:y);}一般我们约定宏名全部大写函数名不全部大写来区分宏和函数。使用#undef可以移除一个宏定义总结例如以上就是今天要讲的内容本文仅仅简单介绍了C语言预处理的使用而预处理提供了大量能使我们快速便捷地处理代码的功能和方法如宏定义、文件包含、条件编译等。
企业数字化 ERP 产品动态
相关推荐
数据结构入门必学:时间复杂度、空间复杂度详细解析(附实例代码) 前言在学习算法的时候,我们经常会遇到一个问题:为什么两个程序实现相同功能,一个运行非常快,一个却非常慢?例如:斐波那契数列:long long Fib(int N)
{if(N < 3)return 1;return Fib(N-1)Fib(… · 2026/9/27 22:57:43
Linux入门指导 1.利用VMware安装Linux操作系统的详细步骤(图➕文字注解)(1)建立硬件选择创建的虚拟机选择自定义高级输入虚拟机名称并选择创建的位置(2)调整虚拟机硬件(3)选择编辑虚拟机设置并安装… · 2026/9/27 22:57:43
软考系统架构设计师论文 —— 论大模型驱动的软件工程架构及其应用(2) 接前一篇文章:软考系统架构设计师论文 —— 论大模型驱动的软件工程架构及其应用(1) 论题
随着大模型(Large Language Model,LLM)在自然语言处理、代码生成和智能决策等方面的突破,软件工程正迎来新一轮范式变革。传统软件开发流程以“需求—设计—编码—测试—运维”为… · 2026/9/27 22:57:43
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19
制作网页比较方便的软件怎么选?一文搞懂避坑指南 制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06
BootCamp6.1.7071驱动包手动安装与回滚全攻略 简介:这是一份面向2019年中期四端口MacBook Pro 15寸、13寸带触控条机型,以及2018年中期MacBook Pro 13寸带触控条机型的Boot Camp 6.1.7071驱动包,主要服务于需要在Mac上安装Windows、更新Boot Camp驱动或修复双系统引导的用户。许多用户在安… · 2026/9/27 23:59:42
Python爬虫京东评论分析:从JSON采集到情感可视化 简介:这是一套基于Python爬虫的京东商品评论采集与分析系统,覆盖文本情感分析和可视化展示,适合计算机、人工智能、电商数据挖掘等方向的学生用于毕业设计或课程实践,也可作为初学者进阶NLP项目的参考。压缩包共113个文件… · 2026/9/27 23:59:36
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
制作网页比较方便的软件怎么选?一文搞懂避坑指南 制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25