Translations of this page?:

va_arg

文法:

    #include <cstdarg>
    type va_arg( va_list 引数ポインタ, タイプ );
    void va_end( va_list 引数ポインタ );
    void va_start( va_list 引数ポインタ, 最後のパラメータ );

va_arg()マクロは、関数に可変個数の引数を渡すのに使用します。

  1. まず最初に、va_start()を呼び出し、va_listと、 関数の可変長引数を表す'…'引数の直前の、必須引数をわたします。もしも必須の引数が一つしかない場合には、これを渡します。そのため、少なくとも一つの必須の引数を宣言する必要があります。この引数はどんなものでも構いませんが、可変長引数の個数を表す整数値を渡すのも一つの方法です。
  2. 次にva_listと、引数の型を指定してva_arg()を呼び出します。va_arg()の返り値は、現在の位置のパラメータになります。
  3. 引数が存在する数だけva_arg()を繰り返し呼び出します。
  4. 最後に、va_listを渡してva_end()を呼び出し、必要な終了処理を行います。

サンプル:

    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( "答えは %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( "文字列: %s\n", s );
       }
       // character
       else if( *format == 'c' ) {
         char c = (char) va_arg( argptr, int );
         printf( "文字: %c\n", c );
         break;
       }
       // integer
       else if( *format == 'd' ) {
         int d = va_arg( argptr, int );
         printf( "整数: %d\n", d );
       }
 
       format++;
     }
 
     va_end( argptr );
   }
 
   int main( void ) {
 
     my_printf( "sdc", "文字列です", 29, 'X' );
 
     return( 0 );
   }

このコードを実行すると、以下のように表示されます:

   文字列: 文字列です
   整数: 29
   文字: X
 
• • • SitemapRecent changesRSScc