ページ 11

printf()等で使用されている可変型の引数について

Posted: 2013年3月22日(金) 20:50
by ブレトン
printf()のような可変引数をもつ関数をラッピング(って言うのでしょうか?)をしたいのですが上手くいきません。

(DXライブラリで書いてたのですがコードが長すぎるので、コンソール用の簡単なサンプルを作りなおしました。)

コード:

#include <stdio.h>
#include <windows.h>
//<windows.h>はSleep()を利用するためのものです。

int printf2(const char *format, ...)
{
	printf(format);
}

int main(void)
{
	//◆本文のみで2番目以降の引数なし
	printf2("私の戦闘力は53万です\n") ;

	//◆引数が2つ以上の場合
	printf2("私の戦闘力は%d万です\n",53);

	Sleep(10000);	//コンソールがすぐに閉じないよう10秒待機
	return 0;
}
■■■↓実行結果↓■■■
私の戦闘力は53万です
私の戦闘力は1638216万です


オリジナルのprintf()関数で実行したら2行目も、1行目と全く同じ結果になるのですが、
作ったprintf2()関数を使うと、2行目は、どこか不明のアドレスから数値を引っ張り込んできたように思います。

何がやりたいかというと、printf2()関数でもprintf()関数と全く同じ結果を出したいのですが、やり方がわかりません。
可変の引数を持つ関数の引数を、そのまま別の関数に受け渡しするのはややこしいのでしょうか?

Re: printf()等で使用されている可変型の引数について

Posted: 2013年3月22日(金) 21:53
by a5ua
可変長引数リストを処理するvprintf関数を使うとできます。
可変長引数リストを取得するには、va_startマクロを使います。

コード:

int printf2(const char *format, ...)
{
	int ret;
	va_list args;
	va_start(args, format);
	ret = vprintf(format, args);
	va_end(args);
	return ret;
}

Re: printf()等で使用されている可変型の引数について

Posted: 2013年3月22日(金) 21:59
by softya(ソフト屋)
a5uaさんの言われる通り、そのままprintfを呼び出すことは出来ません。
「C言語関数辞典 - vprintf」
http://www.c-tipsref.com/reference/stdio/vprintf.html

Re: printf()等で使用されている可変型の引数について

Posted: 2013年3月22日(金) 23:40
by ブレトン
a5uaさん、softya(ソフト屋) さん、返信ありがとうございます。

実は最初の投稿前に、検索してva_startとか、va_listとかもしかしたらこれかな?というのは見つけてはいたのですが、
これを本当に使うのか、使うとしたらどう使えばいいのか、あまり理解できなかったのでスレッドに投稿した次第でした。
ありがとうございました^^