va_arg

[機能]

  va_start,及び,va_end と共に,関数が可変個数を取る場合に,その関数の引数へアクセスする方法を提供するマクロです.関数は,一定の個数の必須引数と,その後に続く可変個数( 0 を含む)の引数を取ると想定しています.必須引数は,通常の引数として宣言され,変数名を通してアクセスできます.va_arg は,arg で示された位置から type 型の値を取得し,次の引数を示すように,arg の値を増加します.

[形式]
#include <stdarg.h>
#include <stdio.h>

type va_arg(va_list arg, type)
	type : 引数のタイプ
	arg  : 可変個数の引数リストへのポインタ		
[使用例]

  1. 必須引数(この例では整数 1 個で,値は 10 )と可変個数の引数(タイプは,double )の平均値を計算します.
    #include <stdio.h>
    #include <stdarg.h>
    
    double average(int, double first, ...);
    
    /************/
    /*     main */
    /************/
    int main()
    {
    	double mean;
    /*
    		 10と4つの実数値の平均値(負の値がデータの終了記号)
    */
    	mean = average(10, 1.0, 2.0, 3.0, 9.0, -1.0);
    	printf("平均値は %f\n", mean);
    /*
    		 10と3つの実数値の平均値(負の値がデータの終了記号)
    */
    	mean = average(10, 1.0, 2.0, 3.0, -1.0);
    	printf("平均値は %f\n", mean);
    /*
    		 可変個数の引数がない場合(負の値がデータの終了記号)
    */
    	mean = average(10, -1.0);
    	printf("平均値は %f\n", mean);
    
    	return 0;
    }
    
    /********************/
    /*     平均値の計算 */
    /********************/
    double average(int base, double first, ...)
    {
    	double sum;
    	double d = first;
    	int count = 1;
    	va_list marker;
    
    	sum = (double)base;
    
    	va_start(marker, first);          /* 可変個引数の初期化 */
    
    	while (d >= 0.0) {
    		sum += d;
    		count ++;
    		d = va_arg(marker, double);   /* 次の引数の取得 */
    	}
    
    	va_end(marker);                   /* 可変個引数のreset */
    
    	return (sum / count);
    }
    			
    (出力)
    平均値は 5.000000
    平均値は 4.000000
    平均値は 10.000000			
[参照]

va_start, va_end, vprintf, vfprintf, vsprintf

菅沼ホーム 本文目次 演習問題解答例 付録目次 索引