宏和函数的区别以及宏的一些简单用法介绍

宏和函数的区别

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

函数:它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。每次使用时只需要调用即可

——————————————————————————————————————————————————————————————————————————————

函数和宏的区别主要从下面几个方面来讨论:
1.代码长度:
:每次使用时代码宏都会被插入到程序中,除了非常小的宏之外,会将程序的篇幅大大增长。
函数:函数的代码只出现在一个位置,每次使用函数时,就调用那个位置的代码。

2.执行速度:
:参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作。
函数:存在调用/返回的额外时间。

3.括号内的操作符 优先级
:宏参数的求值是在所有周围表达式的上下文环境里,除非它们加上括号(尽量能加就加,不要吝啬括号),否则邻近操作符的优先级可能会产生不可预料的结果。(下面文章会有代码演示)
函数:函数参数只在被调用前求值一次,它的结果传递给参数,并不会导致多种求值过程。表达式的求值结果更容易预测

4.参数求值:
:参数每次用于宏定义时,他们都将重新求值,由于多次求值,具有副作用的参数可能会产生不可预料的结果(下面文章会有代码演示
函数:参数在被调用前只求值一次,在函数中多次使用参数并不会导致多种求值过程,参数的副作用并不会造成任何特殊问题。

5.参数类型:
:宏宇类型无关,只要对参数的操作是合法的(比如比大小,只要能用>作比较就可以实现),它可以使用于任何参数类型。
函数:函数的参数需要定义类型,如果参数的类型不同,就要使用不同的函数,及时它们的执行任务是相同的。

———————————————————————————————————————————————————

宏的一些简单用法介绍

宏的申明方式:
#define name(x) x*x
注意:参数列表的左括号必须与name紧邻。
如果两者之间有空白,参数列表会被解释为x*x中的一部分。

使用宏的一些需要注意的地方(坑):
1.括号问题
如 #define square(x) x*x
    一般使用square(5); 没问题,因为文本将会替换为5*5,结果为25.
    但是使用square(2+1); 我们来试一下,并预测一下结果
    
int main()
{
	printf("%d\n",square(2+1));
	return 0;
}
   如果你认为答案是9,那就进坑了
   实际在编译过程中,已经将宏文本替换,priintf("%d\n",2+1*2+1);
   现在看起来一目了然,结果是5。

2.#和##在宏 中的使用
使用#把一个宏参数转化其对应的字符串。
例:
	int i = 10;
#define PRINT(FORMAT,VALUE) printf("the value of\
 " #VALUE " is "FORMAT"\n",VALUE);
	PRINT("%d",i+3);

	return 0;



##把两边的符号合为一个符号
例:
#define ADD_TO_SUM(num,value) sum##num += value;
	int sum5 = 0;
	int ret = ADD_TO_SUM(5,10);
	printf("%d",ret);

将num=5赋值后,此时的sum##num相当于,sum5 += 10;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值