😸

[C] va_copy 関数

に公開

機能

可変長引数リストを複製する。[1]

使用例

合計 = 15 と表示する

\n は改行を表す エスケープシーケンス[2]

コード

va_list ap1, ap2;
va_start(ap1, num);
va_copy(ap2, ap1);
// ap1, ap2 を使った可変長引数処理
va_end(ap1);
va_end(ap2);
全文
#include <stdio.h>
#include <stdarg.h>

int sum_twice(int num, ...) {
    va_list ap1, ap2;
    int sum1 = 0, sum2 = 0;

    va_start(ap1, num);
    va_copy(ap2, ap1);
    // 1回目
    for (int i = 0; i < num; i++) {
        sum1 += va_arg(ap1, int);
    }
    // 2回目
    for (int i = 0; i < num; i++) {
        sum2 += va_arg(ap2, int);
    }
    va_end(ap1);
    va_end(ap2);

    return sum1 + sum2;
}

void main() {
    printf("合計 = %d\n", sum_twice(3, 4, 5, 6));
}

実行結果

合計 = 30

和は 10 を変数から表示する

コード

va_list ap, backup;
va_start(ap, num);
va_copy(backup, ap);
// backup を利用して値を再計算
va_end(ap);
va_end(backup);
全文
#include <stdio.h>
#include <stdarg.h>

int my_sum(int num, ...) {
    va_list ap, backup;
    int sum = 0;

    va_start(ap, num);
    va_copy(backup, ap);

    for (int i = 0; i < num; i++) {
        sum += va_arg(ap, int);
    }
    // backupを使って、再度最初から合計
    va_end(ap);

    va_end(backup);

    return sum;
}

void main() {
    printf("和は %d\n", my_sum(4, 1, 2, 3, 4));
}

実行結果

和は 10
脚注
  1. va_list型の変数を使った関数間の可変引数の受け渡しや複数回の走査に対応するための標準マクロ。C99以降で使用可能。 ↩︎

  2. 改行やタブなど、画面に表示されない制御文字のこと。 ↩︎

Discussion