パラメータの個数を可変にする

printf() のようにパラメータの個数を可変で渡す関数を作成します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 新規プロジェクトで[空のプロジェクト]を作成して下さい。
  2. WinMain() から関数 Func() を二度を呼び出していますが、引数の個数が違います。
    先頭のパラメータは引数の個数です。
        Func(1,10);
        Func(3,10,20,30);
        
  3. Func() では引数の個数を可変で受け取ります。
    「, ...」 に注目して下さい。
    int Func(int n, ...)
    可変個の引数を参照するときは va_list を使います。
    va_list arg;
    arg には最初先頭の引数を設定します。
    va_start(arg,n);
    次の引数を参照するときは va_arg() 関数を使用します。
    引数で渡されるパラメータのサイズは、型によって異なるので型を指定しています。
    va_arg(arg,int);
    参照が終わると va_list を破棄します。
    va_end(arg);
  4. プログラムのソースコードです。
        /******************************************/
        /*★ 可変引数のパラメータ       前田 稔 ★*/
        /******************************************/
        #include    <windows.h>
    
        int Func(int n, ...)
        {   char    buf[80],wk[20];
            va_list arg;
            int     i;
    
            wsprintf(buf,"可変引数(%d) ",n);
            va_start(arg,n);
            for(i=0; i<n; i++)
            {   wsprintf(wk,"%d 番目= %d,  ",i+1,va_arg(arg,int));
                strcat(buf,wk);
            }
            va_end(arg);
            MessageBox(NULL,buf,"可変引数",MB_OK);
            return 0;
        }
    
        //★ Windows MAIN 関数
        int  WINAPI  WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
        {
            Func(1,10);
            Func(3,10,20,30);
            return TRUE;
        }
        

【演習】

  1. 可変個の引数を受け取って MessageBox で表示する関数 Func2 を作成して下さい。
    先頭の引数は整数型で、後の引数は文字型です。
            Func2(1,'A');
            Func2(2,'B','C');
        
  2. 可変個の引数を受け取って MessageBox で表示する関数 Func3 を作成して下さい。
    先頭の引数は整数型で、後の引数は文字列型(文字の配列)です。
            Func3(1,"ABC");
            Func3(2,"ABC","XYZ");
        
  3. この関数では先頭で「引数の個数」を渡していますが、printf() では「個数とタイプ」をどのようにして知るのでしょう。
    引数のタイプによってスタックに詰まれるバイト数が異なります。
    va_arg(arg,int) では、タイプに合わせてスタックを操作して、現在の引数を参照します。

超初心者のプログラム入門(Win32API C++)