格式化字符串,可变参数函数需要借助于va_list va_start va_arg va_end宏,可变参数宏需要借助于##.
变参1:最后一个可见参数类型是int
int add(int n, ...);
int main()
{
printf("%d\n", add(4,1,2,3,4)); /* 计算 1 + 2 + 3 + 4,第一个4,是4个数的意思 */
printf("%d\n", add(3,1,2,3)); /* 计算 1 + 2 + 3 ,第一个3,是3个数的意思 */
return 0;
}
int add(int n, ...) /* 该函数返回 n 个 int 数的和,n个int,跟在第一个参数后面,依次列出*/
{
int i, sum, tmp;
va_list arg; /* 定义 va_list 类型变量 arg */
va_start(arg, n); /* arg初始化,n 是最后一个可见的参数名字 */
for(sum = i = 0; i < n; ++i){
tmp = va_arg(arg, int); /* 每一次获取一个整数,第二个类型,就是获取数的类型 */
sum += tmp;
}
va_end(arg); /* 结束之前,end 一下~~ */
return sum;
}
变参2:最后一个可见参数类型是可变参数的格式化字符串
void test(const char *s, ...)
{
int used = 0;
char *msg = NULL;
va_list arg;
va_start(arg, s);
used = vasprintf(&msg, s, arg);
printf("used is %d\n",used);
printf("%d\n",strlen(msg));
printf("%s\n",msg);
va_end(arg); /* 结束之前,end 一下~~ */
return ;
}
int main()
{
const char *s = "%s-%d-%d";
test(s,"name",1984,321);
test("%d to %d",88,99);
return 0;
}
运行结果:
used is 13
13
name-1984-321
used is 8
8
88 to 99
宏函数
#define log_printf(f,arg...) \
do{ \
char logp[128] = {0};\
sprintf(logp,"func %s line %d"f,__func__,__LINE__,##arg);\
printf("logp %s",logp);\
}while(0)
void main()
{
log_printf("-----------%s\n","this is ringht") ;
do
{
printf("test \n");
}while(0);
return;
}
1. 宏函数的参数没有类型
2. While(0)后需要“;”,所以宏函数中do while不能有大括号包围所有。
3. 也可用vprintf直接打印可变参数到终端
宏函数调用可变参函数举例
#define PRINTF_S(s,arg...)\
do{\
test(s,##arg);\
}while(0)
void test(const char *s, ...)
{
int used = 0;
char *msg = NULL;
va_list arg;
va_start(arg, s);
used = vasprintf(&msg, s, arg);
printf("used is %d\n",used);
printf("%d\n",strlen(msg));
printf("%s\n",msg);
va_end(arg); /* 结束之前,end 一下~~ */
return ;
}
int main()
{
const char *s = "%s-%d-%d-%d";
PRINTF_S(s,"anniversary",2012,10,26);
return 0;
}