不定参数

相关函数及类型

va_list;  //类似char *argv[], 用于接收不定参数
void va_start(va_list ap, last); //初始化, last参数是省略号前的第一个参数
type va_arg(va_list ap, type); //取出参数, type为数据类型
void va_end(va_list ap); //结束, 销毁ap

注意:
如果要遍历所有参数, 不能用va_arg返回值作为判断依据, 需自己显示或隐示(printf中用fmt里的%作为判断依据)传入一个表示数量的参数

例子

例1.求多个数的和

//版本1: 不输出不定参数
void sum(int num_arg,...){
    int i,sum=0;
 
    va_list va;
    va_start(va,num_arg);
 
    for(i=0;i<num_arg;++i)
        sum+=va_arg(va,int);
 
    printf("sum = %d
",sum);
    va_end(va);
}

例2.求未知参数的个数

#include <stdio.h>
 
#define COUNT_ARGS2(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_,...) _
#define COUNT_ARGS(...) COUNT_ARGS2(__VA_ARGS__,10,9,8,7,6,5,4,3,2,1);
 
int main(int argc, char *argv[]){
    int num=COUNT_ARGS("what",1,2.2,"the");
    printf("%d=4
",num);
    return 0;
}

注:__VA_APRGS__是系统宏,作用是将前面的三个冒号的内容原封不动的复制过来
我们自己定义的第一个宏中的类似"_+数字"只是普通的参数, 没有什么特殊作用, 包括第11个参数"_"也只是一个普通参数而已, 这个宏的作用都是将第11个参数返回
第二宏调用第一个宏来取出第11个参数(一个数字); 后面的是数字用于标记参数的个数
这里面的逻辑是:
第一个宏: 定义一个算法, 专门用于计数, 数到11就停, 然后取出这个位置的参数
第二个宏: 将所有参数排位[...[0], ...[1], ...[n], 10, 9, 8, 7, 6, 5, 4, 3, 2, 1], 数到第11个参数取出数字, n+1为可变参数的个数
具体算术为: 第一步算出(11-(n+1))剩多少, 然后从...[n]继续数(10+1)-(11-(n+1))个停下取出数字, 计算(10+1)-(11-(n+1))=11-(10-n)=n+1
这里面有个隐藏条件, 那就是...中的参数个数不超过10个(小于等于10)

原文地址:https://www.cnblogs.com/cfans1993/p/5744726.html