跳轉到內容

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
華夏公益教科書