1.宏返回值的使用
注意:在如果有多条语句的话需要使用do{}while(0)语句,或者({})包括起来。虽然这两个语法
都可以使用宏来进行定义,但是do{}while(0)是没有返回值的
宏返回值的使用:({})可以写多条语句,并且最后一句话的结果就是宏的返回值,具体用法如下
#include <stdio.h>
#define MAX(a,b) ({int max;if(a>b)max=a;else max=b;max;})
int main(int argc,const char *argv)
{
int num=MAX(100,200);
printf("最大值:%d\n",num);
return 0;
}
2.可变参数的使用
解释:
在linux内核中可以使用man手册查看 va_start后会出现一下的几个函数
头文件:
#include <stdarg.h>
函数原型:
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
功能:
va_start(va_list ap, last);//使用last初始化ap,初始化完成后ap里面存的就是last的地址,在函数的内部就确定了栈的类型
va_arg(va_list ap, type);//如果是满减栈那么ap就向下减一个type类型的字节,然后取值
va_end(va_list ap);//在使用完ap后需要进行销毁,因为内部实现的时候涉及到了空间分配
例子:
#include <stdio.h>
#include <stdarg.h>
int add(int n,...)
{
int sum=0;
va_list ap;//定义一个变量ap
va_start(ap,n);//对ap进行初始化
int i;
for(i=0;i<n;i++)
{
sum+=va_arg(ap,int);
}
va_end(ap);
return sum;
}
int main(int argc,const char *argv[])
{
printf("%d\n",add(3,1,2,3));
return 0;
}