Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

可変長引数(va_list, va_start, va_arg, va_end)を扱ってみた。

スポンサードリンク

f:id:fa11enprince:20200615143655j:plain
他の人のソースコードをみて、va_listを使っているのがあって、そういえば、自分では使ったことがなかったなと思い、可変長引数を受けとって処理するva_list, va_start, va_arg, va_endを使ってみました。
おおまかな使い方は行かな感じ。

void hoge(const char *fmt, ...)
{
	va_list list;
	va_start(list, fmt);
	...
	// fmt以降の引数を順次取り出し
	va_arg(list, int);    // int型の引数を取り出し
	va_arg(list, char *); // char *型の引数を取り出し
	...
	va_end(list);
}

似たような奴にvsprintfとかあるんですが、使いどきがわからないです。
C++使っていればそんなに使う機会ないのかも。
無駄にCっぽく書いてますが、C++でコンパイルしています。
なんかメモリリークが心配になりそうなコードですが・・・。多分大丈夫でしょう。Cはデバッグ難しいですよね。一回あれれってなってgdb使ってました。でもめんどくさくなってきて途中でprintfしました。

ソースコード

printfっぽいものを実装。

にしても、安直に書くと、関数に渡した文字列を破壊してしまうコードを書きがちですよね。とはいえCはそういうのが多いからいいかと思ったり・・・。どういうスタイルで書くべきなのかっていうのはコードをもっと読まなきゃダメっすね・・・。