宏与函数

在这里简单的作一下宏与函数的对比总结:

先分别用宏和函数写一段小代码:—(找出两个整数中的最大值)

用宏的方法:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<windows.h>
#define GET_MAX(a, b) ((a)>(b)?(a):(b))
int main()
{
	int a = 1;
	int b = 2;
	int max = GET_MAX(a, b);
	printf("max=%d\n", max);
	system("pause");
	return 0;
}

用函数的方法:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<windows.h>
int get_max(int x, int y)
{
	return (x > y) ? (x) : (y);
}
int main()
{
	int a = 1;
	int b = 2;
	int max = get_max(a, b);
	printf("max=%d\n",max);
	system("pause");
	return 0;
}

执行结果是一样的:

              

再总结一下宏与函数的区别:

宏与函数的区别
  #define宏 函数
组成

#define   name  ( parament-list )      stuff 

           (宏名)(参数列表)      (宏内容

    ret_type     fun_name  ( para1 ,*)

返回类型)(函数名)(函数参数

代码长度 每次使用时,宏代码都被插入到程序中,除了非常小的宏之外,程序的长度都将大幅度增长 函数代码只出现在一个地方,每次使用这个函数时,都调用哪个地方的同一份代码。
操作符优先级 宏参数的求值是在所有周围表达式的上下文环境中,除非它们加上括号,否则邻近操作符的优先级可能会产生不可预料的结果 函数参数值在函数调用时求值一次,它的结果值传递给函数,表达式的结果更容易预测
执行速度 更快 存在函数调用/返回的额外开销
参数求值 参数每次用于宏定义时,它们都将重新求值,由于多次求值,具有副作用的参数可能会产生不可预料的结果。 函数在参数被调用前只求值一次,在函数中多次使用参数并不会导致多种求值过程。参数的副作用并不会造成任何特殊的问题。
参数类型 宏与类型无关,只要对参数的操作是合法的,它可以使用于任何参数类型。

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

此外,一般情况下我们对宏与函数的使用语法很相似,语言本身没法帮我们区分二者,故有如下命名规则:

宏名全部大写;函数名不要全部大写



猜你喜欢

转载自blog.csdn.net/n_peng/article/details/80233019