va_start | Programming Place Plus C言語編 標準ライブラリのリファレンス

トップページC言語編標準ライブラリのリファレンス(名前順)

トップページC言語編標準ライブラリのリファレンス(ヘッダ別)


va_start

概要

va_list を初期化し、可変個引数の使用を開始する。

ヘッダ

stdarg.h

形式

#define va_start(ap, v) ((ap)=(va_list)&(v)+sizeof(v))

引数

ap

va_list型の変数。

v

可変個引数でない最後の仮引数。

戻り値

なし。

詳細

va_list に、最初の可変個実引数を指すポインタを設定する。可変個仮引数には名前がなく、直接的に指定することができないため、可変個部分でない最後の仮引数の名前を指定する。

そうして、マクロ内で計算によって可変個実引数の位置を導き出している。このような仕組みである都合上、可変個部分でない最後の仮引数に、register指定子が指定されていたり、配列型や関数型であったり、int よりも小さい整数型であったりしてはならない。いずれかに該当した場合の動作は未定義である。

注意

va_argva_end を呼ぶ前に必ず呼び出さなければならない。また、va_end を呼ぶ前に、再初期化を行うことを目的に va_start を呼び出してはならない。

使用例

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

void print(const char* format, ...);

int main(void)
{
    print("ddcd", 10, 20, 'x', 30);
    print("ss", "abc", "def");
    print("dfc", 50, 3.3, 'Z');
}

/*
    標準出力へ任意の個数・型の値を出力する
    引数:
        format:     変換指定子を並べたもの。以下のいずれかとする。
                        d … 符号付き整数型
                        f … 実浮動小数点型
                        c … 文字型
                        s … 文字列型
                    とする。
                    たとえば、"dds" と指定すると、
                    後続の実引数が 整数型, 整数型, 文字列型 の順番で並んでいるものと判断される。
        ...:        出力する値のリスト
*/
void print(const char* format, ...)
{
    va_list args;
    va_start(args, format);

    for (const char* p = format; *p != '\0'; ++p) {
        switch (*p) {
        case 'd':
            printf("%d ", va_arg(args, int));
            break;
        case 'f':
            printf("%lf ", va_arg(args, double));
            break;
        case 'c':
            printf("%c ", va_arg(args, char));
            break;
        case 's':
            printf("%s ", va_arg(args, const char*));
            break;
        default:
            assert(!"不正な変換指定");
            break;
        }
    }
    printf("\n");

    va_end(args);
}

実行結果

10 20 x 30
abc def
50 3.300000 Z

関連

可変個引数の一連の処理を終えるとき、va_start と対応関係にある va_end を呼ぶ。

解説章

第52章


参考リンク


更新履歴

’2018/4/19 全体的に文章を見直し修正。
「ヘッダ」が誤っていたのを修正。「詳細」に可変個でない最後の仮引数の条件を追記。

’2018/1/22 新規作成。



標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る