thisdesuのブログ

C言語はじめました

にほんブログ村 IT技術ブログ C/C++へ

可変引数

関数を使ってると引数の個数を可変にしたいなーって思う時があります。これまた難しいのですが、よく使う関数printf系が可変なので身近で使っているから簡単に出来そうなんて思う今日この頃。
可変長引数はコンパイラなど環境依存と言いますがお行儀依存しますので、今回のサンプルが使えないのは覚悟です。はい。

関数定義は、[...]と点を3つほど書けば以後引数は可変ですって事です。

int _myprint(char *name, ...);


取り出し方

va_list  : 可変引数の構造体
va_start : 開始位置を構造体へ設定
va_arg   : 値を取り出し
va_end   : 終了宣言


■サンプルコード

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

int _myprint(char *name,int cnt, ...) {
    va_list ap;
    int i;
    int val;

    va_start(ap, cnt);

    for(i=0;i<cnt;i++) {
        val = va_arg(ap,int);
        printf("<%s>[%d]=%d\n",name,i,val);
    }

    va_end(ap);

    return(0);
}

int main() {
    _myprint("test1",3,11,22,33);
    _myprint("test2",5,1,22,333,4444,55555);

    return(0);
}


■結果
$ gcc main.c
$ ./a.out
<test1>[0]=11
<test1>[1]=22
<test1>[2]=33
<test2>[0]=1
<test2>[1]=22
<test2>[2]=333
<test2>[3]=4444
<test2>[4]=55555