可变参数函数和宏函数

格式化字符串,可变参数函数需要借助于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;  
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值