C/C++中stdarg.h或cstdarg编写如printf一样参数可以是变长的任意类型和任意个数的函数

stdarg.h  stdarg.h是C语言中C标准函式库的标头档,stdarg是由standard(标准) arguments(参数)简化而来,主要目的为让函式能够接收不定量参数。[1] C++的cstdarg标头档中也提供这样的机能;虽然与C的标头档是相容的,但是也有冲突存在。  不定参数函式(Variadic functions)是stdarg.h内容典型的应用,虽然也可以使用在其他由不定参数函式呼叫的函式(例如,vprintf)。  宣告不定参数函式  不定参数函式的参数数量是可变动的,它使用省略号来忽略之后的参数。例如printf函式一般。代表性的宣告为:  int check(int a, double b, ...);  不定参数函式最少要有一个命名的参数,所以  char *wrong(...);  在C是不被允许的(在C++中,这样的宣告是合理的)。在C,省略符号之前必须要有逗号;在C++,则没有这种强制要求。

va_list 用来指向参数 C89 

 stdarg.h巨集名称 描述 相容  

va_start 使va_list指向起始的参数 C89 

 va_arg 检索参数 C89  

va_end 释放va_list C89  

va_copy 拷贝va_list的内容 va_copy(va2, va1)意思为拷贝va1到va2。

eg:

例子 

va_arg 自己要访问参数,例如一个函数,它取任意数量的int 参数,并把它打印出来

 #include <stdio.h> 

 #include <stdarg.h>  

void printargs(int arg1, ...) /* 输出所有int型态的参数,直到-1结束 */  

{  va_list ap;  

int i;  

va_start(ap, arg1);   

for (i = arg1; i != -1; i = va_arg(ap, int)) //或者不用某个结束标志,用下面的去代替这个for循环

//int temp;

//for(i=0;i<arg1;i++){

//temp=va_arg(ap,int);

//printf("%d",temp);


//}

 printf("%d ", i);  

     va_end(ap); 

 putchar('\n');  } 

 int main(void) 

 {  printargs(5, 2, 14, 84, 97, 15, 24, 48, -1); 

 printargs(84, 51, -1);  

    printargs(-1); 

 printargs(1, -1);  return 0;  

}  

这个程式产生输出:  5 2 14 84 97 15 24 48  84 51  1

又如:c++中假设要编写一个快速的调式函数,如果设置了调式标志,则将字符串打印到stderr中,否则,什么也不做。

#include<cstdio>

#include<cstdarg>
bool debug=false;
void debugOut(char*str,...)
{
    if(debug)
    {
     va_list ap;
     va_start(ap,str);
     vfprintf(stderr,str,ap);//cstdio库中函数
     va_end(ap);
    
    }


}
void main()

{   debug=true;
    printf("int:%d String:%s\n",5,"hello");
    debugOut("int:%d String:%s\n",5,"hello");//功能和printf一样


}




注意:后面的省略号(...)表示任意类型和任意个数的参数,c规定可变长函数的第一个,必须是命名参数,c++没有这样规定

va_list  ap  ; 声明va_list 变量

va_start    初始化va_list变量,带二个参数,第一个是ap,第二个必须是参数列表最右边的命名参数,所以函数都必须要一个命名参数

va_end   结束对变长参数列表的访问


你可能感兴趣的:(C/C++中stdarg.h或cstdarg编写如printf一样参数可以是变长的任意类型和任意个数的函数)