《C语言进阶》以实现取两数中的较大值为例深析宏定义和函数的区别

目录

1.代码

2.深析二者异同及优缺点

      3.总结


 1.代码

1>宏定义

#define MAX(x,y) ((x>y)?(x):(y))

int main()
{
	int x = MAX(10, 20);
	printf("%d", x);
	return 0;
}

2>函数定义

int Max(int x, int y)
{
	return x > y ? x : y;
}
int main()
{
	int x = Max(10, 20);
	printf("%d", x);
}

2.深析二者异同及优缺点

1>代码长度

我们首先要知道,define定义的预处理指令会在代码编译前将define定义的符号替换为对应代码,这时候如果代码中有多次出现define定义的符号,每次使用时,宏代码都会被插入到程序中,就会大大增加代码长度。

函数代码只出现于一个地方,每次使用这个函数时,都调用那个 地方的同一份代码。

2>执行速度

宏定义在函数编译前将宏代码插入到函数中,调用时不会额外浪费时间,运行速度更快。

函数定义存在每次调用和返回的额外开销,所以相对于宏定义来说,函数在执行速度上要慢一些。

3>操作符优先级

宏定义是将宏代码直接插入到原代码中,很容易与上下文的代码发生冲突,除非加上括号,否则邻近操作符的优先级可能 会产生不可预料的后果,所以建议宏在书写的时候 多些括号。

函数参数只在函数调用的时候求 值一次,它的结果值传递给函 数。表达式的求值结果更容易预 测。

4>带有副作用的参数

宏定义中,参数可能被替换到宏体中的多个位置,所以带有副 作用的参数求值可能会产生不可预料的结果。

函数参数只在传参的时候求值一 次,结果更容易控制。

5>参数类型

宏定义中,宏的参数与类型无关,只要对参数的操作是合法 的,它就可以使用于任何参数类型。

函数的参数是与类型有关的,如果参数的类型不同,就需要不同的函数,即使他们执行的任务是
相同的。

6>调试

宏是不方便调试的。

函数是可以逐语句调试的。

7>递归

宏不可以递归。

函数可以递归。

3.总结

总的来说,宏和函数各有各的好处,我们无法确切的说哪个更好,但他们同样也有各自的优缺点,只要我们熟练掌握了他们的优缺点,在使用时避免他们的缺点,我们就可以在要使用他们是熟练的挑选出最合适的那种方法。

本文到此结束,感谢大家的阅读,欢迎大家点赞评论互关,祝大家万事如意。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>