函数分为很多种,相信大多数人的c语言学的也都是学了个大概,可能也有人不知道有这样一种东西,除了宏函数,其他的函数在汇编层面都会使用call这个指令去跳转而宏顾名思义就是去做文本替换。
注意,在定义一个宏函数时,单词的所有字母应全部大写!!可以当作一种优秀的代码规范,提醒你这是一个宏函数。
观察下面这个例子
#define SQUARE(x) x*x;
int main()
{
int x=3;
printf("%d",SQUARE(1+a));
return 0;
}
SQRTX(1+a)
//这里被解释为 1+3*1+3=7
其实文本上的替换也没有那么靠谱对吧,观察下面这个例子
#define DOUBLE(x) (x)*(x)
int main(){
int x = 3;
printf("%d",10*DOUBLE(x));
return 0;
}
跑一下这个程序以观察跟你预想的结果一不一样,你或许会发现怎么还是不对
注意,在所有使用预定义语句声明的宏函数,在所有变量和运算符上都应带上括号以避免出现逻辑错误
#define DOUBLE(x) ((x)*(x))
int main(){
int x = 3;
printf("%d",10*DOUBLE(x));
return 0;
}
以上是宏函数的一个小例子,简单描述了宏函数的用途
以下作一个总结,宏函数是有其利弊的,
1.利则是它没有如一个函数那样call的额外调用开销,在某些小型的计算中,计算的开销可能小于call的开销。
2.还能有利于梳理代码的逻辑,因为省去了具体的实现过程,你可以做到像函数一样去使用它
3.虽然上文没有提到,还有一个好处就是你可以用一种类似于其他编程语言的方式去编写一个c的程序。
弊端也很明显,作为一种编程手段,逻辑问题是首要去考虑的,就像上面的例子,它和函数上的定义办法还是有明显区别的,稍有不注意就可能发生逻辑错误。
诚然我实际上并未使用过严格的c程序,因为入门时第一个代码编辑器是visual studio,众所周知的是vs只有C++,C++98,C++11,以及后面的版本提供的编程手段已经极为详尽了,如boost提供的bind()函数以及其他的绑定函数让我们几乎可以摆脱宏函数的使用,除非实际情况需要,我并不推荐用宏函数。