可変個数の引数リスト va_list (va_start/va_arg/va_end)

引数の数が固定ではなくいくつになるか分からない場合はvaマクロを使用すると便利です。
可変の数の引数をva_listに格納して、va_start、va_arg、va_endを使用して操作を行うという流れになります。

以下は、関数から渡された異なる数の引数を渡され、引数の平均値を求めるサンプルです。

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

/* 引数のリストの数値の平均値を算出 */
double average ( int num, ...){
    va_list arguments;
    double sum = 0;

    /* 引数の初期化 numより後ろの全引数をリストに格納する */
    va_start ( arguments, num);

    /* numの数ループ */
    for ( int x = 0; x < num; x++)
    {
        sum += va_arg ( arguments, double);
    }
    /* リストをクリア */
    va_end ( arguments);

    return sum / num;
}

int main(){
    /* 平均値を計算 「引数の数:3」 「値:12.2, 22.3, 4.5」 */
    printf( "%f\n", average ( 3, 12.2, 22.3, 4.5));
    /* 平均値を計算 「引数の数:5」 「値:3.3, 2.2, 1.1, 5.5, 3.3」 */
    printf( "%f\n", average ( 5, 3.3, 2.2, 1.1, 5.5, 3.3));
}

va_start

void va_start(va_list ap, last);

可変個数引数のリストを初期化します。
第一引数apに引数のリストが格納されます。第二引数lastを指定すると、元関数の引数lastの次からのリストに格納する引数

va_arg

type va_arg(va_list ap, type);

リストからtypeで指定した引数を返します。処理が終了すると、ポインタが加算され、リスト内の次の引数に移動します。(次の引数が返却されるようになります。)

va_end

void va_end(va_list ap)

引数リストをクリアします。

  • このエントリーをはてなブックマークに追加

関連記事

no image

C++ vs Java,C# 違い

なぜ、JavaやC#は、クロスプラットフォームで、移植性の高いプログラムが作成でき、C++は同じようにできないのか? 「なんとなく」から「じっくり」理解してみようと思います。 C++ コンパイ

no image

ワイド文字 wchar_t

wchar_tリテラル(wchar_t literal)は、文字リテラル(char literal)と同じ方法で表現されるのか? 答えは、No。ワイド文字定数(wchar_t)は、文字Lが前に付

no image

C++ コードブロック

コードブロックを使用するとランタイムの非効率化を招くのか? 言い換えれば、{ and } プログラム実行時に、余計な時間がかかってしまうのか? 答えは、No。 コードブロックは、オーバヘッドを

no image

C++のいろんなデータ型

なぜ、C++には整数値や浮動小数点値に対して、様々な種類のデータ型が用意されているのでしょうか? 数値を表すのに全て同じ型にしないのでしょうか? 項目については、他の方のブログに譲るとして、

no image

C++の型には最小の範囲だけが明記されている理由

明確な範囲を指定しないことによって、C++は様々な環境のコンパイラに各々で最適化できるようにしています。これが、C++が高性能のソフトウェアを実現できる所以とも言われます。 「ANSI/ISO

no image

コンパイラ エラーと警告(メッセージ)

エラーメッセージに加えて、コンパイラは様々なタイプの警告メッセージを提供してくれます。エラーと警告の違いは何でしょうか? どのようなタイプの出力を参照すればいいのでしょうか? 致命的なシンタッス

no image

OOP ⊂ C++

大規模なプログラムを管理するうえで、オブジェクト指向プログラミング(OOP)は、効果を発揮するというのが、一般的な考えですが、「オブジェクト指向は、他と比較して大きなオーバヘッドが存在しないのか??」

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

PAGE TOP ↑