广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中宏和函数的区别有哪些
  • 462
分享到

C语言中宏和函数的区别有哪些

2023-07-05 23:07:00 462人浏览 安东尼
摘要

这篇文章主要介绍了C语言中宏和函数的区别有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言中宏和函数的区别有哪些文章都会有所收获,下面我们一起来看看吧。C语言中的宏和函数是非常相似的,它们都可以完成类似

这篇文章主要介绍了C语言中宏和函数的区别有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言中宏和函数的区别有哪些文章都会有所收获,下面我们一起来看看吧。

C语言中的宏和函数是非常相似的,它们都可以完成类似的功能。比如,想要求2个数的较大值,使用宏的写法是:

// 宏的定义#define MAX(x, y) ((x)>(y)?(x):(y))// 使用int m = MAX(10, 20);

使用函数的写法是:

// 函数的定义int Max(int x, int y){return x>y ? x : y;}// 使用int m = Max(10, 20);

既然宏和函数长的那么像,究竟什么时候用宏,什么时候用函数呢?这就要了解一下它们之间的区别了。我总结了他俩之间的区别,主要体现在以下几点:

代码长度。

执行速度。

操作符优先级。

带有副作用的参数。

参数类型。

调试。

递归

命名约定。

其他。

1.代码长度

宏会在每个使用它的地方替换。比如前面提到的求两个数的较大值的宏,假设这么使用:

int m = MAX(10, 20);// ...m = MAX(20, 30)// ...m = MAX(30, 40);// ...// ...

每个使用宏的地方都会被替换掉。

int m = ((10)>(20)?(10):(20));// ...m = ((20)>(30)?(20):(30))// ...m = ((30)>(40)?(30):(40));// ...// ...

这里的宏体比较短,所以替换进去后,代码的长度并没有明显的提升。但是,假设这个宏有100行代码,每个地方展开后,展开3次,就会多出300行代码。如果更加频繁的调用,调用100次,就会多出10000行代码。所以,当宏体比较长,尤其是调用次数还比较多的情况下,会导致代码长度大大增加。

而函数就不存在这个问题,函数不管调用几次,都只需要写一次函数的代码,每次使用时直接调用即可,代码长度是可控的。

2.执行速度

函数调用时,需要在栈空间上开辟一块栈帧,参数还要压栈。当函数体的代码执行完后,需要返回时,还要销毁栈帧。这些都是有开销的,执行速度较慢。

但是,宏的代码在预处理阶段就已经完成替换,不存在这个问题,执行速度较快。

3.操作符优先级

使用宏时,代码是在对应的位置直接展开,如果该位置周围有其他操作符,有可能干扰宏体内的操作符的执行顺序,导致错误的结果。比如:

#define DOUBLE(x) x+x

如果这么调用:

int ret = 2 * DOUBLE(10);

我们想的是:DOUBLE(10)会算出20,再乘2,得到40。然而,实际代码会这样展开:

int ret = 2 * 10+10;

由于乘号的优先级比较高,会先算2*10,得到20,再加10得到30,和预期的结果不一致。

但函数不存在这个问题。

int Double(int x){    return x+x;}

当这样调用时:

int ret = 2 * Double(10);

一定是先把10传给函数,函数计算完后返回20,再进行别的计算。

当然,如果参数本身是表达式时,也会有相同的问题。比如:

#define SQUARE(x) x*xint Square(int x){    return x*x;}int ret1 = SQUARE(3 + 2);int ret2 = Square(3 + 2);

函数就是正常的,先计算3+2得到5,在把5传参,得到25。但是宏会这样替换:

int ret1 = 3 + 2*3 + 2;

由于乘号的优先级较高,得到的结果就是11,和预期结果不符。

为了解决这样的问题,建议写宏时多加括号,防止受到其他操作符的影响。比如:

#define DOUBLE(x) ((x)+(x))#define SQUARE(x) ((x)*(x))

4.带有副作用的参数

对于MAX宏,如果这样使用:

int x = 3;int y = 5;int m = MAX(x++, y++);

我们的想法是:把x和y传参,算出x和y的较大值为5,即m应该是5,而后置++会把x和y的值分别改成4和6。但是实际替换时是这么替换的:

int m = ((x++)>(y++)?(x++):(y++));

计算时,先判断x++>y++这个表达式,显然x<y,故为假,判断完后x和y都要++,x改成4,y改成6,返回y++的结果,即6,y再++改成7。所以最终结果是:m为6,x为4,y为7,和预期不符,原因是带有副作用的宏参数影响了结果。

函数就不存在这个问题。如果调用Max函数:

int x = 3;int y = 5;int m = Max(x++, y++);

由于函数的传参和函数体代码的执行是分开的,所以结果和预期相同,m=5, x=4, y=6。

5.参数类型

宏是直接对代码进行文本替换,是不检查类型的。比如:

int m1 = MAX(3, 5);// 会被替换成int m1 = ((3)>(5)?(3):(5));double m2 = MAX(3.2, 5,3); // 会被替换成double m2 = ((3.2)>(5.3)?(3.2):(5.3));

但是函数的形参是有类型的,传参时会对类型进行检查。比如前面的Max函数,参数列表是(int, int),只能求2个整数的较大值,如果要求两个浮点数的较大值,是无能为力的。

6.调试

宏直接完成代码的替换,不方便调试。因为宏的替换在预处理阶段已经完成,但是调试时调试的是最终生成的可执行程序。由于已经完成了替换,看到的代码和调试的代码是不一样的。函数就没有这个问题,可以逐语句调试。

7.递归

宏不能递归,函数可以实现递归。

8.命名约定

一般宏的名字为全大写,函数名不会全大写。比如:

宏名:MAX, DOUBLE, SQUARE。

函数名:Max, Double, Square。

但是也有例外。比如库中的offsetof是一个宏,而不是函数。

关于“C语言中宏和函数的区别有哪些”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C语言中宏和函数的区别有哪些”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C语言中宏和函数的区别有哪些

本文链接: https://www.lsjlt.com/news/355784.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言中宏和函数的区别有哪些
    这篇文章主要介绍了C语言中宏和函数的区别有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言中宏和函数的区别有哪些文章都会有所收获,下面我们一起来看看吧。C语言中的宏和函数是非常相似的,它们都可以完成类似...
    99+
    2023-07-05
  • C语言中宏和函数的9个区别详解
    目录1.代码长度2.执行速度3.操作符优先级4.带有副作用的参数5.参数类型6.调试7.递归8.命名约定9.其他总结C语言中的宏和函数是非常相似的,它们都可以完成类似的功能。比如,想...
    99+
    2023-05-14
    C语言 函数区别 C语言 函数 C语言 C语言 函数
  • C语言中函数宏封装的方式有哪些
    本篇内容介绍了“C语言中函数宏封装的方式有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 函数宏介绍函数宏,即包含多条语句的宏定义,...
    99+
    2023-07-05
  • C/C++细数宏与函数有那些区别
    目录一、宏和函数的对比1.宏的优点2.宏的缺点3.宏的独特性4.总结并整理宏和函数的区别5.有没有宏和函数的结合体二、宏和函数的命名约定一、宏和函数的对比 1.宏的优点 宏通常被应用...
    99+
    2022-11-13
    C++宏与函数区别 C++宏与函数
  • C语言和C#有哪些区别
    这篇文章主要介绍“C语言和C#有哪些区别”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言和C#有哪些区别”文章能帮助大家解决问题。C#是三大主流OOP(面向对象编程)语言(C++,Java,C#...
    99+
    2023-06-27
  • c++内联函数和宏函数有什么区别
    C++内联函数和宏函数都可以在编译时进行函数体的替换,但是它们有以下几点区别:1. 编译时间点:宏函数在预处理阶段被展开,而内联函数...
    99+
    2023-10-19
    c++
  • javascript和c语言有哪些区别
    本篇内容主要讲解“javascript和c语言有哪些区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript和c语言有哪些区别”吧! ...
    99+
    2022-10-19
  • java和c语言有哪些区别
    java和c语言的区别有:1.语言类型不同;2.通用性不同;3.数据类型不同;4.文件组织方式不同;5.应用领域不同;java和c语言的区别有以下几点语言类型不同java是一种面向对象的语言,执行效率高;而c语言是一个面向过程的语言。通用性...
    99+
    2022-10-10
  • php和C语言的区别有哪些
    php和C语言的区别有:1、两者性质不同,php是一种通用开源脚本语言,而C语言是一门通用程序设计语言;2、特点不同,php拥有自己独创的语法,而C语言能以简易的方式编译以及处理低级存储器;3、两者优势不同,php具有较高的数据传送处理水平...
    99+
    2022-10-07
  • 汇编语言和c语言的区别有哪些
    本文小编为大家详细介绍“汇编语言和c语言的区别有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“汇编语言和c语言的区别有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。区别:1、因为汇编语言实质上是机器语言...
    99+
    2023-07-04
  • php中语言结构和函数有哪些区别
    这篇文章将为大家详细讲解有关php中语言结构和函数有哪些区别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。区别:1、语言结构比对应功能的函数快;2、语言结构不能在配置文件“php.ini”中禁用,而函数可...
    99+
    2023-06-29
  • go语言中方法和函数的区别有哪些
    本文小编为大家详细介绍“go语言中方法和函数的区别有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言中方法和函数的区别有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。区别:1、函数function...
    99+
    2023-07-04
  • C语言中scanf和printf的区别有哪些
    这篇文章将为大家详细讲解有关C语言中scanf和printf的区别有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。区别:scanf是输入函数,用于从标准输入设备(一般是键盘)输入数据;而printf是...
    99+
    2023-06-14
  • c语言中abs()和fabs()的区别有哪些
    这篇“c语言中abs()和fabs()的区别有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“c语言中abs()和fabs...
    99+
    2023-06-17
  • c语言中*p和p的区别有哪些
    这篇文章主要讲解了“c语言中*p和p的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c语言中*p和p的区别有哪些”吧!区别:1、表示的含义不同,“*p”表示此指针指向的内存地址中存...
    99+
    2023-07-04
  • php的语法和c语言有哪些区别
    这篇文章将为大家详细讲解有关php的语法和c语言有哪些区别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。语法上的区别:1、PHP使用define函数来定义常量,c语言不是;2、php的所有的变量名前都要带...
    99+
    2023-06-14
  • c语言与go语言的区别有哪些
    小编给大家分享一下c语言与go语言的区别有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!区别:1、C语言源文件的扩展名是“.h”和“.c”,Go语言源文件的扩展名是“.go”。2、C语言中通过文件来管理代码,Go语言中...
    99+
    2023-06-06
  • C语言和其他编程语言的区别有哪些
    这篇文章主要讲解了“C语言和其他编程语言的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言和其他编程语言的区别有哪些”吧!  一、静态内存  内存管理---存储模型  存储模型...
    99+
    2023-06-17
  • java与c语言的区别有哪些?
    java与c语言的区别有哪些?1、Java与C内存分配不同:Java中内存分配五个区,分别为栈区(存储的是局部变量,使用完毕,立即回收),堆区(存储的是new出来的东西,实体,对象,每一个对象都有地址值,每个对象的数据都有默认值,使用完毕后...
    99+
    2020-10-28
    java教程 java c语言
  • c语言与javascript的区别有哪些
    这篇文章给大家分享的是有关c语言与javascript的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 区别:1、C语言主要是被编译成机器语...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作