宏和函数

从宏和函数引出内联函数 从上一篇文章中,我们讨论了一下关于宏定义的写法,逐步深入讨论了了不同级别的程序员编写宏定义的手法。MAX宏定义的基础和深度扩展 https://blog.youkuaiyun.com/yixuanyuxiao/article/details/136953694今天我们来看一下利用宏定义编写类似函数调用的方法和真实的函数有什么区别,来进一步理解宏定义的应用。首先来看一个例子: 这里,我们得理解宏的工作方式,它是在编译器编译代码之前做的一个纯文本的替换工作。因此,有时候简单宏替换的结果就会和我们预想的结果出现偏差,比如 阅读详情

此为C语言的基础,和Linux内核关系并不大,不过还是作为补充知识点介绍一下好了。宏非常频繁的用于执行简单的计算,比如在两个表达式中寻找其中较大的一个:

#define MAX(a,b) ((a)>(b)?(a):(b))

如果使用函数来实现的话就比较慢,宏的话在编译的时候就完成工作,所以使用宏远比使用函数调用效率来的可观。和使用函数相比,使用宏的不利之处就在于每次使用宏的时候,一个宏定义代码的拷贝就插入到程序中,这样会增加程序的长度。除非非常的短,否则使用宏可能大幅增加程序的长度。

1.宏的副作用,就拿上面MAX举例

#define MAX(a,b) ((a)>(b)?(a):(b))
int x=5;
int y=8;
int z=MAX(x++,y++)
printf("%d %d %d\n",x,y,z);

输出结果是:6,10,9

和往常一样,只要检查一下宏替换代码如下:

z=((x++)>(y++)?(x++):(y++));较大的数会增加两次哎!


2.#define需要注意的地方

  • #define name stuff

如果stuff比较长,每行的末尾要加上\。

#define DEBUG_PRINT printf("string:%s,"\
						"x=%d,y=%d,z=%d",\
						"hello",x,y,z)
int main()
{
	int x=1,y=2,z=3;
	DEBUG_PRINT;
	return 0;
}

我们利用了相邻的字符串会自动连接为一个字符串的特性。

  • #define name(param-list) stuff
比如#define SQUARE(x) x*x
这里有个问题:a=5,SQUARE(a+1)就有问题。乍一看没啥问题,觉着会输出36,但是结果却是11.想知道为什么?宏替换如下:a+1*a+1=11。解决方法就是给宏加上括号
#define SQUARE(x) (x)*(x)
我们再看另外一种情况
#define DOUBLE(x) (x)+x(x)
10*DOUBLE(2)得到多少?本来我们想得到的结果是:40,但是实际结果却是22
所以改为:#define DOUBLE(x) ((x)+(x))

Proteus一体化安装STC15库添加 Proteus一体化安装与STC15库添加指南 本文详细介绍了Proteus 8.9 SP2专业版的一体化安装流程和STC15系列单片机库文件的添加方法。安装过程简单快捷,无需破解,稳定性好。通过将两个库文件(Lib和LIB)复制到Proteus安装目录的DATA/LIBRARY文件夹中,即可实现STC15W4K32S4芯片的仿真功能。文中还提供了新建工程和器件放置的步骤说明,特别指出STC15W4K32S4芯片可兼容仿真其他STC15系列芯片,并附带下载链接获取资源。该教程适用于电子设计初学者和开发者。 阅读详情

相关推荐

手把手教你用OpenClaw+飞书打造论文写作AI助手(附踩坑实录)

面对几十篇文献,逐一阅读摘要都费时。我:“请提取桌面‘论文参考文献’文件夹中所有PDF的摘要,整理成表格,包含:论文标题、作者、发表年份、核心方法、主要结论。AI助手:“正在处理...已提取18篇论文摘要,汇总表格已保存到桌面‘文献摘要汇总.xlsx’。这比我自己一个个打开PDF复制粘贴快了不止100倍。OpenClaw+飞书的组合,让AI真正成为了我的“数字员工”。虽然配置过程有些曲折,但看到它在飞书里回应指令、帮我处理繁琐工作时,那种成就感无可替代。如果你也在准备论文,不妨试试这套方案。记住,

AcademicIdeas的博客 1041

宏介绍以及宏和函数的区别

要区分宏和函数,就要了解什么是宏。 宏 #define机制包括了一个规定: 允许把参数替换到文本中,这种实现通常称为宏(macro),或定义宏; #define name(parameter-list) behavior 注意:参数列表的左括号要紧贴name 例如: #define double(x) x+x int main() { int a=10; printf("%d",double(a)); } 输出结果为20; 在double出现的地方,double会被自动替换成x+x,而x会被替换成

geek! 945

Win11内核隔离无法打开的解决方案详解

内核隔离问题的解决需遵循"先硬件后软件"的排查原则,90%以上的案例可通过驱动清理或外设断开解决。对于必须禁用该功能的用户,建议定期使用Windows Defender进行全盘扫描,并保持系统更新至最新版本。技术决策需在安全性和兼容性之间取得平衡,本文提供的多维解决方案可帮助用户构建更稳定的Windows 11使用环境。

mmoo_python的博客 4825

宏和函数的区别

宏和函数的区别

weixin_71853810的博客 1501

FID指标实战:如何用Python快速计算生成图像的质量分数(附完整代码)

本文详细介绍了如何使用Python计算Fréchet Inception Distance(FID)指标,以评估生成图像的质量。通过完整的代码示例和优化技巧,帮助开发者快速实现FID计算,并解读分数背后的实际意义,适用于GAN和扩散模型的性能评估。

weixin_28718487的博客 375

配置Dot1q终结子接口实现跨设备VLAN间通信示例

示例图 一.实验目的 1.配置Dot1q终结子接口实现跨设备VLAN间通信示例 二.注意事项 1.Dot1q终结子接口和QinQ终结子接口不支持透传不带VLAN Tag的报文, 收到不带VLAN Tag的报文会直接丢弃 2.由于三层以太网子接口不支持VLAN报文,当它收到VLAN报文时,会将VLAN报文当成是 非法报文而丢弃,因此,需要在子接口上将VLAN Tag剥掉,也就是需要VLAN终结 三.VLAN终结简介 1.VLAN终结的实质包含两个方面: ①.对接口接收到报文,剥除VLAN标

qq_44751470的博客 7097

宏、函数、宏和函数的区别

先说宏和函数的区别:1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型.2. 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的.3. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数

言安阳 518

硅谷刷屏的ClawdBot,让Mac mini卖爆了!创始人爆料:一人开发、100% AI 写代码

这两天,个人 AI 助手 ClawdBot 席卷硅谷,国内外社交平台上全是关于它的讨论。 在试用后,网友们纷纷给出了很高的评价。“它是迄今为止最伟大的 AI 应用,相当于你 24 小时全天候专属 AI 员工。”Creator Buddy 创始人兼 CEO Alex Finn 盛赞道,“这就是他们 (Anthropic) 希望 Claude Cowork 呈现的样子。”

技术引领业务创新 1583

C++宏和函数的区别

宏在C++中主要用于编译时的代码替换和减少重复代码,适用于简单的操作和常量表达式的替换。然而,滥用宏可能导致代码难以调试和维护,因此需要谨慎使用。

如无必要,勿增实体。 1425

PLC凸轮开关指令编程应用——控制算法

凸轮开关指令的作用是在PLC程序中根据凸轮开关(Cam Switch)的状态执行不同的操作。凸轮开关通常是机械式的开关装置,它的位置会随着机械运动的变化而改变。凸轮开关的状态可以用来检测机器的位置、角度或其他相关信息,从而触发相应的控制动作。总结起来,凸轮开关指令是PLC编程中常用的一种控制算法,通过检测凸轮开关的状态来触发相应的操作。本文将介绍凸轮开关指令的应用和相应的控制算法,并提供相关的源代码示例。在这个示例中,凸轮开关状态的值代表不同的位置,根据凸轮开关状态的不同,执行相应的动作。

LiJavascript的博客 1034

深度学习+遥感:2025最新土地利用分类资源大全(数据集/论文/代码)

近年来,深度学习在遥感影像土地利用分类领域取得了突破性进展,从传统的农田、森林识别,到复杂的城市功能区划分,AI正在重新定义我们对地表覆盖的认知。无论是科研还是工程应用,高质量数据集、前沿算法和开源工具都是成功的关键。本文精心整理了2024年最值得关注的土地利用分类资源,包括:✅ 10+个权威数据集(覆盖全球、多分辨率、多光谱/雷达)✅ 15+篇顶会论文(CNN/Transformer/自监督学习等SOTA方法)✅ 6大开源工具箱(PyTorch/Keras实现,即拿即用)

hanfeng5268的博客 1312

【C/C++内功心法】详解宏和函数的区别

1.每次使用时,宏代码都会被插入到程序中。除了非常小的宏之外,程序的长度会大幅度增长。函数代码只出现于一个地方;每次使用这个函数时,都调用那个地方的同一份代码。2.宏的执行速度更快。函数的调用和返回的会有额外开销,所以相对慢一些。3.宏的参数与类型无关,只要对参数的操作是合法的, 它就可以使用于任何参数类型。函数的参数是与类型有关的,如果参数的类型不同,就需要不同的函数,即使他们执行的任务是不同的。

这是一个非常有意思的博主 3996

在claude code中使用glm模型出现Unable to connect to Anthropic services的解决方案

本文主要介绍了在claude code中使用glm模型出现Unable to connect to Anthropic services的解决方案,希望能对使用claude code的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 13万+

ue4 函数和宏区别_UE4(蓝图)函数,事件,宏的区别

蓝图中事件、函数的区别 ?1.Delay/timeslines这些需要等待时间的节点,事件中可以调用,函数不能调用。2.函数可以有返回值,事件没有返回值。 原因:1).函数调用会立刻执行并等待结果,事件调用只是触发 ;2).函数执行在同一线程,事件执行在不同线程3.函数可以用局部变量,事件没有局部变量。4.因为函数执行顺序有保证,所有优先使用函数。5.没有返回值的函数,在被子类Overide时,会...

weixin_33359523的博客 4094

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

宏的特点和使用和宏和函数的对比

宏通常被应用于执行简单的运算。比如在两个数中找出较大的一个

li1829146612的博客 1095

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

宏和函数对比

宏和函数的对比 宏的优点、缺点 函数的优点、缺点

weixin_74837727的博客 771

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C语言之 宏和函数不为人知的那些事

括号的重要性:在定义宏时,务必加上括号。这是因为在使用宏进行运算时,会涉及到运算符的优先级问题。如果不加括号,可能会得到意想不到的结果。例如:#define DEFULL(n) n*n//(n)*(n)加上括号就可以了,不会受到运算符优先级的影响了int main()int n = 0;//如果你输入的是3+1的话传过去之后你得到的值不是你想得到的16,而是7return 0;//还有一种情况就是((n)*(n))的情况。

2401_85286030的博客 6821

宏和内联函数的区别

宏和内联函数的区别 总结: 内联函数是对宏的优化 1 宏 宏常量 例:#deifne PI 3.14 优点:一改全改,调高代码的复用性 提高性能 缺点:定义宏出错时,不容易定位错误,因为预处理阶段进行了替换(代码展开) 在c++中对宏常量进行了优化 : 用const 修饰变量 同时const具有宏常量的属性 int main() { const int a = 10; ...

zwq68的博客 1146

总结一下宏和函数的区别

今天总结一下宏和函数的区别,还有各自的优缺点。 宏在预处理阶段会被编译器替换掉,而且宏一般只做简单的文本替换,编译器对其不做任何的语法检测。 宏定义时主要用于以下两方面: 1、简单文本或字符串的替换; 2、宏函数。 对于宏函数,我们可能比较陌生,下面举例来介绍一下宏函数: #define SQUARE(x) ((x)*(x)) int main() { int input...

qq_37611061的博客 345

宏和函数的对比

目录 前言 宏的优势 宏的缺点 前言 我们知道,在C语言中,宏的功能是必不可少的。因为相对来说,宏是简单的,因为宏只在预处理阶段进行操作,之后,程序的进行与宏基本没有什么关系了。 而对于函数来说,是需要进行调用的,也即是需要调用函数堆栈的,所以相对来说,函数对于整个程序来说是比较繁琐的。 好的,那么我们进入正文。 ...

qq_52777887的博客 915
上一篇: linux系统调用原理分析
下一篇: AT&T汇编指令介绍
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值