首先我们先来看一下什么是宏?
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有些疑惑了,那么什么时候使用宏,什么时候使用函数?
建议是:如果代码逻辑比较简单,那么推荐使用宏;反之推荐使用函数。
最后,我们再来看一下两者的命名
宏与函数的命名对比(建议)
宏名全部大写(大多数情况下)
函数名不要全部大写