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 );
}