宏与函数两者之间的差异

首先我们先来看一下什么是宏?

1、#define 定义宏

#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义
宏(define macro)。

下面是宏的申明方式:

#define name( parament - list ) stuff
注意:
参数列表的左括号必须与 name 紧邻。
如果两者之间有任何空白存在,参数列表就会被解释为 stuff 的一部分。
#include<stdio.h>

#define SQUARE(x) x*x

int main()
{
	printf("%d\n",SQUARE(5));

	return 0;
}

 如果你以为宏这就完了的话,那么恭喜你可能会g。

我们在看一段代码

#include<stdio.h>

#define SQUARE(x) x*x

int main()
{
	printf("%d\n",SQUARE(5+1));

	return 0;
}

这个代码是36没问题吧?让我们看看结果

不要惊讶?让我解释一下。

首先宏在预处理阶段就被直接替换了的,那么SQUARE(5+1)直接被替换成了5+1*5+1 。

那么我们能怎么得到我们想要的结果呢?

加括号,宏一定不要吝啬括号。

#include<stdio.h>

#define SQUARE(x) ((x)*(x))

int main()
{
	printf("%d\n",SQUARE(5+1));

	return 0;
}

注意事项

1. 宏参数和 #define 定义中可以出现其他 #define 定义的符号。但是对于宏,不能出现递归。
2. 当预处理器搜索 #define 定义的符号的时候,字符串常量的内容并不被搜索。

宏与函数的差别

宏的优点

1、相比于函数,运行速度更快。

2、相比于函数,宏的参数不限于类型。)

3、同时,宏的参数可以出现类型。

#define MALLOC(num,type) (type*)malloc(num*sizeof(type))

int main()
{
	int* p1 = (int*)malloc(10 * sizeof(int));

	int* p2 = MALLOC(10, int);

	return 0;
}

宏的缺点

1、会使得代码变得冗长,除了非常小的宏之外,程序的长度会大幅度增长。

2、算数符号的优先级可能会影响到最终运算结果。(在不注意加括号的前提下),同时一些带有副作用的参数,也可能影响最终结果(比如参数带有前置++或者后置++)。

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

int Max(int x, int y)
{
	return x > y ? x : y;
}

int main()
{
	int m = 4;
	int n = 6;
	printf("%d\n", MAX(m++, n++));
	printf("%d %d\n", m, n);
	int x = 4;
	int y = 6;	
	printf("%d\n", Max(x++,y++));
	printf("%d %d\n", x,y);

	return 0;
}

 

3、因为不限类型,所以不够严谨。

4、宏不能够调试(宏在预处理阶段就完成了替换,而调试是在代码执行时)。

5、宏不能递归。

函数的优点

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

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

测。

3、函数可以逐语句调试。

4、函数可以递归。

函数的缺点

1、函数调用,函数中运算的执行,函数返回都需要时间。

2、函数参数需要规定类型。

说到这里,可能xdm有些疑惑了,那么什么时候使用宏,什么时候使用函数?

建议是:如果代码逻辑比较简单,那么推荐使用宏;反之推荐使用函数。

最后,我们再来看一下两者的命名

宏与函数的命名对比(建议)

宏名全部大写(大多数情况下)

函数名不要全部大写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值