可変長引数とは
可変長引数とは、渡す引数の型を自由に決められる関数のことで、引数の数を事前に決めておく必要がない仕組みのことをいいます。つまり、1個以上の引数があれば、その型を自由に設定して、引数を何個でも渡すことができる柔軟な関数を作ることができます!
void function(char *fmt, ...)
// 「char *fmt が1個以上の通常の引数
// 「...」 これが仮引数の可変にする部分でござるよ。
C言語で、可変長引数を扱うための標準ライブラリヘッダー。
#include <stdarg.h>
<stdarg.h>
ヘッダーの中に可変長引数を管理するための便利な仕組み(マクロと型)が用意されています。
関数 | 詳細 |
---|---|
va_start | 可変長引数関数の引数にアクセスできるようにします |
va_copy | 可変長引数関数の引数をコピーします |
va_list | va_start, va_arg, va_end, va_copy で使用される情報を保持します |
va_arg | 可変長引数関数の次の引数にアクセスします |
va_end | 可変長引数関数の引数の巡回を終了します |
マクロと型の説明
簡単にマクロとは?
- コードを簡潔に記述したり、繰り返し使用する定義を事前に準備する仕組みのことだよ
va_list
- 何をするもの?
- 可変長引数のリストを管理するためのデータ型
- これが「可変長引数をまとめて扱う箱」になる
va_start
- 何をするもの?
- 可変長引数リストの「準備」をする
- 必ず「最後の名前付き引数」を教えてから使う
va_arg
- 何をするもの?
- 可変長引数リストから1つの値を取り出す
- 値の型を指定して使う
va_copy
- 何をするもの?
-
va_copy
はva_list
をコピーするマクロ - 可変長引数を2回以上読みたい場合に便利
-
イメージとしては、va_listが「リストの箱」、va_startで箱を開けて、va_argで中身を取り出し、最後にva_endで箱を片付ける感じ!
ただし、可変長引数を使うときにはいくつかルールがあります
- 少なくとも1つの通常の引数(名前付き引数)を先に書く必要があります
- これは、引数の数や型を管理する目印となるためです
- 可変長引数は、関数の仮引数リストの最後に置く必要があります
- これは構文上のルールです
これが可変長引数の大まかなの流れ
#include <stdio.h>
#include <stdarg.h>
void func(char *fmt_1, ...)
{
va_list ap;
va_start(ap, fmt_1);
/*処理〜*/
va_end(ap);
}
分かりやすい例え
可変長引数を使うと、それがぐーんと楽になるよ!
まるで、いつでも友達を好きなだけ、好きなタイプの人たちも自由に家に招待できるみたいな感じ。普通の関数は『3人までで、しかも全員同じタイプじゃないとダメ!』みたいな感じだけど、可変長引数の関数は『何人来ても、どんなタイプでも大丈夫だよ!』って感じなんだ。
プログラミングでは、引数の数だけでなく、それぞれの型も自由に設定して、好きなだけデータを渡せる特別な仕組みなんだね。まるで、パーティーの定員もなく、どんなゲストでも歓迎する自由な会場みたいに、引数を柔軟に受け取れるんだ。すごく便利で使いやすい機能だよ!
特徴 | 普通の引数 | 可変長引数 |
---|---|---|
引数の数 | 決まっている | 呼び出しごとに変えられる |
引数の型 | 固定 | 自由だが、関数内で管理が必要 |
例 | int add(int a, int b) |
int printf(const char *format, ...) |
最後に
少しでも参考になれば幸いです。
最後までご覧いただき、本当にありがとうございます。