一开始将宏函数定义的时候,为了书写方便,将一个函数写成了几行,但是没有用连接符号连接起来,类似于下面
1 #define CHECK(ret) ({
2 int ret;
3 ...
4 })
我马上想到的是我的下面定义的 int ret往下都没有包括进宏里面,这个宏,定义的是 CHECK(ret) == ({ ; 下面空出来的都是在main函数以外,这个当然会报错了,然后我用了连接符号,代码如下
1 #define CHECK(ret) ({ \
2 int ret;
3 })
宏的定义是怎么结束的,宏的结尾是没有分号的,那么推断宏是通过回车来结束的,也就是整个一行都是宏,所以当宏很长时,就要用到连接符来连接了。
自定义函数 type func(arg){; ;}
下面简述一下两者的区别:
1.宏函数只是简单的代码复制
2.宏函数的形参没有分配空间
3.宏函数的运行速度比较快,因为不需要压栈出栈的操作
4.宏函数需要多加点括号
1.自定义函数只在目标文件中存在一处
2.自定义函数处理比较慢,因为涉及到了压栈出栈的操作
3.自定义函数的参数需要分配空间
4.存在值传递和引用传递的问题,而宏函数不存在这样的问题