在这里简单的作一下宏与函数的对比总结:
先分别用宏和函数写一段小代码:—(找出两个整数中的最大值)
用宏的方法:
#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 ,*) (返回类型)(函数名)(函数参数) |
代码长度 | 每次使用时,宏代码都被插入到程序中,除了非常小的宏之外,程序的长度都将大幅度增长 | 函数代码只出现在一个地方,每次使用这个函数时,都调用哪个地方的同一份代码。 |
操作符优先级 | 宏参数的求值是在所有周围表达式的上下文环境中,除非它们加上括号,否则邻近操作符的优先级可能会产生不可预料的结果 | 函数参数值在函数调用时求值一次,它的结果值传递给函数,表达式的结果更容易预测 |
执行速度 | 更快 | 存在函数调用/返回的额外开销 |
参数求值 | 参数每次用于宏定义时,它们都将重新求值,由于多次求值,具有副作用的参数可能会产生不可预料的结果。 | 函数在参数被调用前只求值一次,在函数中多次使用参数并不会导致多种求值过程。参数的副作用并不会造成任何特殊的问题。 |
参数类型 | 宏与类型无关,只要对参数的操作是合法的,它可以使用于任何参数类型。 | 函数的参数是与类型有关的。如果参数的类型不同,就需要使用不同的函数,即使它们执行的任务是相同的。 |
此外,一般情况下我们对宏与函数的使用语法很相似,语言本身没法帮我们区分二者,故有如下命名规则:
宏名全部大写;函数名不要全部大写