C言語 | 高度な機能 | 可変引数

可変引数関数は、printf() のように個数が変わる引数を受け取れます。

省略記号と可変引数

最後の固定パラメータの後に省略記号 (...) を書きます。

int printf(const char *format, ...);

引数へアクセスするには stdarg.h のマクロを使います。

void va_start(va_list arg_ptr, prev_param);
type va_arg(va_list arg_ptr, type);
void va_end(va_list arg_ptr);

va_start()va_list を初期化します。第2引数には最後の固定パラメータを指定します。va_arg() を呼ぶたびに、指定した型で次の引数を取得します。最後に va_end() を呼びます。

関数側は引数の個数と型を把握する必要があります。printf() は書式文字列から判断します。デフォルト引数昇格にも注意してください。浮動小数点の可変引数は float ではなく double として取得します。

fValue = va_arg(arg_ptr, double);
pStr = va_arg(arg_ptr, char *);

コード1

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

void DynamicParameter(int arg_num, ...) {
  va_list args;
  int iValue, iCount;

  if (arg_num < 1) return;
  va_start(args, arg_num);
  for (iCount = 0; iCount < arg_num; iCount++) {
    iValue = va_arg(args, int);
    printf("第%d引数 = %d\n", iCount + 2, iValue);
  }
  va_end(args);
}

int main() {
  DynamicParameter(4, 10, 20, 30, 40);
  return 0;
}

この関数は省略可能な引数の個数を最初に受け取り、その数だけ int 値を読み取ります。可変引数関数は柔軟ですが、解析処理が複雑になるため必要な場合に使います。