一:不定参宏函数
#define LOG(fmt,...) printf("[%s,%d]"fmt,__FILE__,__LINE__,##__VA_ARGS__);
//##是允许你不用%s,我注释的那句就是没有##的写法
int main(){
printf("[%s,%d]:%s,%d\n",__FILE__,__LINE__,"加油",666);
//LOG("%s","你好");
LOG("你好");
return 0;
}
二:单一类型不定参
va_list那几句是套路,记住就好了。中间是处理,按具体情况来
#include<stdio.h>
#include <stdarg.h>
//C语言版不定参数
//应对单类型
void printNum(int n,...) //n是几个参数的意思
{
va_list ap;
va_start(ap,n);//让ap指向n之后的第一个可变参数
for(int i=0;i<n;i++)
{
int num=va_arg(ap,int);//从可变参数中取出一个整形
printf("%d",num);
}
printf("\n");
va_end(ap);
}
int main(){
printNum(2,1,2);
printNum(3,1,2,3);
return 0;
}
三:多类型不定参
vasprintf 它可以通过可变参数创建一个格式化的字符串,并将其存储在动态分配的内存中。其存储在一个指向字符数组的指针中。
#include<stdio.h>
#include <stdarg.h>
#include <stdlib.h>
//C语言版不定参数
//应对多类型
void myprint(const char* fmt,...)
{
va_list ap;
va_start(ap,fmt);
char* res;
int ret=vasprintf(&res,fmt,ap);//用于处理传不同类型的
if(ret!=-1) {
printf(res);
free(res);//不能忘 这是用vasprintf的必要要求
}
va_end(ap);
}
int main(){
myprint("%s\n","你好");
myprint("%s%s\n","你好","加油");
myprint("%s%s%d\n","你好","加油",666);
return 0;
}