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

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

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


va_copy

概要

va_list のコピーを作る。

ヘッダ

stdarg.h

形式

#define va_copy(dest, src) ((dest) = (src))

引数

dest

コピー先

src

コピー元

戻り値

なし。

詳細

va_list のコピーを作る。引数dest はまず、va_startマクロを適用したときと同じ方法で初期化され、その後、引数src に対してこれまでに実行された va_argマクロを、同じ順序で適用する。
使用後の va_endマクロは、コピー元とコピー先とがそれぞれ呼ばなければならない。

注意

再初期化を行うことを目的に、va_endマクロを適用することなく、va_copyマクロを使ってはならない。

使用例

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

void output_log(FILE* fp, const char* str, ...);

int main(void)
{
    int value0 = -100;
    int value1 = 100;

    FILE* fp = fopen("log.txt", "a");
    if (fp == NULL) {
        fputs("ファイルオープンに失敗しました。\n", stderr);
        exit(EXIT_FAILURE);
    }

    output_log(fp, "test message\n");
    output_log(fp, "value0: %d  value1: %d\n", value0, value1);

    if (fclose(fp) == EOF) {
        fputs("ファイルクローズに失敗しました。\n", stderr);
        exit(EXIT_FAILURE);
    }
}

/*
    標準出力と、任意のファイルへ出力
    引数:
        fp:     出力先ファイルのポインタ。
        str:    出力するメッセージ。

    出力形式は、printf関数と同様。
    引数fp の指定に関わらず、標準出力へは出力される。
    引数fp がヌルポインタの場合は、標準出力にのみ出力する。
*/
void output_log(FILE* fp, const char* str, ...)
{
    va_list args1, args2;

    va_start(args1, str);
    va_copy(args2, args1);

    vprintf(str, args1);

    if (fp != NULL) {
        vfprintf(fp, str, args2);
    }

    va_end(args2);
    va_end(args1);
}

実行結果 (標準出力)

test message
value0: -100  value1: 100

実行結果 (log.txt)

test message
value0: -100  value1: 100

関連

可変個引数の一連の処理を終えるとき、va_end を呼ぶ。

解説章


参考リンク


更新履歴

’2018/4/26 新規作成。



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

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

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

Programming Place Plus のトップページへ



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