C言語-可変引数

可変引数とは

可変引数(または可変長引数)とは、関数に対して不定個数の引数を渡す(引数の個数を変える=可変)処理を行う仕組みです。

printf()やscanf()のように複数の引数を任意に渡す関数を実現します。


可変引数の実装

C言語では「stdarg.h」を利用して可変引数の処理を実現します。

stdarg.hの利用により、下記マクロの呼び出しが可能になります。


va_list 可変長引数を操作するために必要な構造体
va_start (ap, v) 可変長引数を操作する上で必要なデータを取得するマクロ
va_arg (list, mode) 可変長引数から、順に引数を取り出すマクロ
va_end (list) 可変長引数の操作を終了するマクロ

可変引数サンプル

デバッグメッセージの出力処理を行います。


#include <stdio.h>
#include <stdarg.h>

void
debug_message( char *filename, unsigned int lineno, 
               const char *funcname, char *fmt, ... )
{
    va_list args;

    va_start( args, fmt );
    fprintf(  stderr, "DEBUG: %s(%d)%s: ", filename, lineno, funcname );
    vfprintf( stderr, fmt, args );
    va_end( args );
    return;
}

int
main( int argc, char *argv[] )
{
    int rc = 3;
    debug_message( __FILE__, __LINE__, __FUNCTION__, "rc=%d", rc );  
    return( 0 );
}

可変引数をひとつずつ取得する


static void
va_print( int num, ... )
{
  va_list ap; 
  char *param = NULL;
  int cnt = 0;
  
  va_start( ap, num );
  param = va_arg( ap, char * ); /* 可変引数を取得 */
  
  for( cnt=0; cnt<num; cnt++ ){
    printf("(%d)%s\n", cnt+1, param);
    param = va_arg( ap, char * );
  }

  va_end(ap);
  return;

}

int
main( int argc, char *argv[] )
{
    va_print( 3, __FILE__, __FUNCTION__, "debug" );
    return( 0 );
}

関連ページ