可変長引数とは?C言語での仕組みと使いどころをわかりやすく解説

C言語では、関数の引数の数は通常あらかじめ決めておく必要があります。

しかし、printfのように「引数の数が可変な関数」も存在します。

この記事では、可変長引数の仕組みと使い方、注意点まで含めて解説します。


目次

可変長引数とは何か

結論から言うと、可変長引数とは

👉 引数の数を可変にできる関数の仕組みです


■ 例:printf

C
printf("%d %d", 10, 20);
printf("%d %d %d", 10, 20, 30);

👉 引数の数が変わっている


初心者さん

引数の数って決まってるんじゃないんですか?

エンジニアくん

普通はそう。でも特別な仕組みで可変にできるんだ


C言語文法解説シリーズ

本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説しています。

C言語文法解説シリーズ一覧はこちら

可変長引数の仕組み

可変長引数は、stdarg.h を使って扱います。


■ 基本構文

C
#include <stdarg.h>

void func(int count, ...) {
    va_list args;
    va_start(args, count);    
    
    // 引数を取り出す    
    va_end(args);
}

■ 各要素の役割

  • ... → 可変長引数の宣言
  • va_list → 引数を扱うための型
  • va_start → 取得開始
  • va_arg → 引数を1つずつ取得
  • va_end → 終了処理

■ 実際の例

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

int sum(int count, ...) {
    va_list args;
    va_start(args, count);    
    int result = 0;    
    
    for (int i = 0; i < count; i++) {
        result += va_arg(args, int);
    }    
    
    va_end(args);
    return result;
}

👉 呼び出し👇

C
sum(3, 10, 20, 30);  // 60

なぜこの仕組みで動くのか

ここが理解のポイントです👇

👉 引数はメモリ上に連続して並んでいる

そのため、

  • 最初の引数(count)を基準に
  • その後ろを順番に読む

ことで、可変長引数を取得できます。


可変長引数の注意点

ここはかなり重要です👇


① 型安全ではない

C
va_arg(args, int);

👉 型を自分で指定する必要がある

もし間違えると👇

  • 未定義動作
  • バグの原因

初心者さん

型って自動で分からないんですか?

エンジニアくん

分からない。だから使う側が責任を持つ必要があるんだ


型についてはこちらの記事で解説しています。

② 引数の数を別で管理する必要がある

今回の例では👇

C
sum(3, 10, 20, 30);

👉 3 が必要

これがないと👇

  • どこまで読むか分からない

③ 可読性が下がる

  • 何を渡しているのか分かりにくい
  • バグを生みやすい

実務での使いどころ

可変長引数は便利ですが、使用は限定的です。


■ 主な用途

  • printfのようなフォーマット関数
  • ログ出力
  • 汎用的なラッパ関数

■ 組み込みでの扱い

組み込みでは:

👉 基本的にあまり使わない

理由:

  • 型安全でない
  • デバッグしづらい
  • 可読性が下がる

👉 必要な場合のみ限定的に使用するのが一般的です


まとめ

  • 可変長引数は「引数の数を可変にできる仕組み」
  • stdarg.h を使って扱う
  • メモリ上の並びを利用して取得している
  • 型安全でないため注意が必要
  • 実務では限定的に使用する

この記事が参考になった方へ

関数を含むC言語の基本文法をこちらの記事で整理しています。

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

組み込みソフトエンジニアとして働きながら、
C言語・メモリ・ポインタなどの基礎から実務まで解説しています。

副業・キャリアについても実体験ベースで発信中です。

X(旧Twitter)でも発信しています
👉 Xはこちら

▼まずはここから読むのがおすすめ
C言語文法シリーズ
メモリ領域解説シリーズ

コメント

コメントする


目次