C语言预处理

目录

什么是预处理

#define定义常量

什么是宏定义常量

宏定义常量的好处 

#define定义宏

带有副作用参数的宏

宏替换的规则

宏函数的对比

#和##

宏的命名

#undef

命令行定义

条件编译

头文件的包含

其他预处理指

什么是预处理

C语言里的预处理,简单来说就是在真正开始编译你的源代码之前,有个特殊的“预备队”先上场,帮你把原始代码整理得更规整、更适应编译器的要求,同时也让你编程时能更方便、更灵活。这个“预备队”就是预处理器,它干的活儿是在编译流程的最前端单独进行的,比检查语法、理解代码含义那些步骤还要早。

#define定义常量

什么是宏定义常量

在编程中我们经常会用到一些常量,比如圆周率的值,最大最小值,长度宽度等,这些变量伴随我们的整个程序,我们就可以用一个宏来替换,例如:

#define PI 3.1415926
#define MAX 100
#define MIN 0
#define ROW 10
#define COL 10

宏定义常量的好处 

在编程实践中,我们时常会遇到一些常数,它们如同程序的脉络一般,贯穿于各个角落,对算法逻辑、数据结构乃至系统行为产生深远影响。然而,当需要调整这些常数时,问题便凸显出来:我们必须逐一排查并手动修改它们在源代码中每一次出现的位置,这无疑是一项既繁琐又易出错的任务,极大地降低了工作效率,且不利于代码维护。

此时,宏定义常量的优越性便显现无遗。借助宏定义,我们只需在一处为这些常数赋予新的名称和值,随后在整个程序中以宏名代替实际数值。一旦宏的值发生变更,预处理器便会以“魔法之手”般的力量,悄无声息地将所有引用宏之处更新为新的值。如此一来,改动一处,全局皆变,省却了在代码汪洋中寻觅与替换的辛劳,极大地提升了调整常数的效率,也确保了改动的一致性与准确性。

总结来说,宏定义常量犹如一把精巧的钥匙,解锁了高效管理贯穿程序全局常数的难题。它以一处定义、处处生效的方式,简化了常数修改的过程,避免了人工逐行排查的困扰,确保了代码的整洁与维护性,堪称提升编程效率与代码质量的得力助手。

#define定义宏

我们学过函数,但你知道宏也可以实现类似函数的功能吗?

例如,我们想要计算一个数的平方,除了用函数以外,我们还可以用宏来完成这个功能,例如:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

#define SQRT(x) ((x)*(x))

int main()
{
	printf("%d", SQRT(5));
	return 0;
}

像这样我们就可以实现一个数的平方操作,也就是将x等量替换成5

注意事项 

需要注意的是,宏和函数不同,这个在下面我们也会继续讲到

宏仅仅只是简单的替换,他不会根据你想的意思去执行命令,比如如果你在定义宏的时候是这么定义的:

#define SQRT(x) x*x

而如果这时x的值为3+3,那么在宏替换的时候就会变成这样:

3+3*3+3

其结果是 15,这很显然不是我们想要的结果,注意宏替换只是简单的替换,所以我们在使用宏的时候一定要注意多加括号,否则可能会造成不必要的损失

带有副作用参数的宏

我们看看下面两个例子:


                
下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿梦Anmory

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值