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

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

先頭へ戻る

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 outputLog(FILE* fp, const char* str, ...);

int main(void)
{
    int value0, value1;
    FILE* fp;


    value0 = -100;
    value1 = 100;

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

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

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

    return 0;
}

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

    出力形式は、printf関数と同様。
    引数fp の指定に関わらず、標準出力へは出力される。
    引数fp がヌルポインタの場合は、標準出力にのみ出力する。
*/
void outputLog(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 のトップページへ


このエントリーをはてなブックマークに追加
rss1.0 取得ボタン RSS