跳转到内容

C++ 编程/代码/标准 C 库/函数/va arg

来自维基教科书,开放的书籍,面向开放的世界
语法
#include <cstdarg>
type va_arg( va_list argptr, type );
void va_end( va_list argptr );
void va_start( va_list argptr, last_parm );

va_arg() 宏用于向函数传递可变数量的参数。

  1. 首先,您必须调用 va_start(),并将有效的 va_list 和省略号 ("...") 前最后一个参数变量的名称作为参数传递。第一个参数可以是任何内容;一种使用方法是将其设置为一个整数,表示要传递的参数数量。
  2. 接下来,您调用 va_arg(),并将 va_list 和要返回的参数类型作为参数传递。va_arg() 的返回值是当前参数。
  3. 根据您拥有的参数数量重复调用 va_arg()。
  4. 最后,必须调用 va_end(),并将 va_list 作为参数传递,以便进行适当的清理。
int sum( int num, ... ) {
  int answer = 0;
  va_list argptr;            

  va_start( argptr, num );            

  for( ; num > 0; num-- ) {
    answer += va_arg( argptr, int );
  }           

  va_end( argptr );           

  return( answer );
}             
                

int main( void ) {            

  int answer = sum( 4, 4, 3, 2, 1 );
  printf( "The answer is %d\n", answer );           

  return( 0 );
}

此代码显示 10,即 4+3+2+1。

以下是另一个可变参数函数的示例,这是一个简单的打印函数

void my_printf( char *format, ... ) {
  va_list argptr;             

  va_start( argptr, format );          

  while( *format != '\0' ) {
    // string
    if( *format == 's' ) {
      char* s = va_arg( argptr, char * );
      printf( "Printing a string: %s\n", s );
    }
    // character
    else if( *format == 'c' ) {
      char c = (char) va_arg( argptr, int );
      printf( "Printing a character: %c\n", c );
      break;
    }
    // integer
    else if( *format == 'd' ) {
      int d = va_arg( argptr, int );
      printf( "Printing an integer: %d\n", d );
    }          

    *format++;
  }            

  va_end( argptr );
}              
                

int main( void ) {             

  my_printf( "sdc", "This is a string", 29, 'X' );         

  return( 0 );
}

运行此代码时,将显示以下输出

Printing a string: This is a string
Printing an integer: 29
Printing a character: X
华夏公益教科书