C言語では、関数の引数の数は通常あらかじめ決めておく必要があります。
しかし、printfのように「引数の数が可変な関数」も存在します。
この記事では、可変長引数の仕組みと使い方、注意点まで含めて解説します。
可変長引数とは何か
結論から言うと、可変長引数とは
👉 引数の数を可変にできる関数の仕組みです
■ 例:printf
printf("%d %d", 10, 20);
printf("%d %d %d", 10, 20, 30);👉 引数の数が変わっている
初心者さん引数の数って決まってるんじゃないんですか?



普通はそう。でも特別な仕組みで可変にできるんだ
C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説しています。
C言語文法解説シリーズ一覧はこちら


可変長引数の仕組み
可変長引数は、stdarg.h を使って扱います。
■ 基本構文
#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→ 終了処理
■ 実際の例
#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;
}👉 呼び出し👇
sum(3, 10, 20, 30); // 60なぜこの仕組みで動くのか
ここが理解のポイントです👇
👉 引数はメモリ上に連続して並んでいる
そのため、
- 最初の引数(count)を基準に
- その後ろを順番に読む
ことで、可変長引数を取得できます。
可変長引数の注意点
ここはかなり重要です👇
① 型安全ではない
va_arg(args, int);👉 型を自分で指定する必要がある
もし間違えると👇
- 未定義動作
- バグの原因



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



分からない。だから使う側が責任を持つ必要があるんだ
型についてはこちらの記事で解説しています。


② 引数の数を別で管理する必要がある
今回の例では👇
sum(3, 10, 20, 30);👉 3 が必要
これがないと👇
- どこまで読むか分からない
③ 可読性が下がる
- 何を渡しているのか分かりにくい
- バグを生みやすい
実務での使いどころ
可変長引数は便利ですが、使用は限定的です。
■ 主な用途
- printfのようなフォーマット関数
- ログ出力
- 汎用的なラッパ関数
■ 組み込みでの扱い
組み込みでは:
👉 基本的にあまり使わない
理由:
- 型安全でない
- デバッグしづらい
- 可読性が下がる
👉 必要な場合のみ限定的に使用するのが一般的です
まとめ
- 可変長引数は「引数の数を可変にできる仕組み」
stdarg.hを使って扱う- メモリ上の並びを利用して取得している
- 型安全でないため注意が必要
- 実務では限定的に使用する
この記事が参考になった方へ
関数を含むC言語の基本文法をこちらの記事で整理しています。


技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。









コメント