先頭へ戻る

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

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

Programming Place Plus トップページ -- 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 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 のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー