はじめて 可変引数の関数を 使ってみた!!

仕事でデバッグプリントを作っていて、引数が可変なのでprintf()のような関数が必要になり、初めて可変引数の関数を作った・・・

■必要になって理由
はじめprintf()で画面にデバッグメッセージを表示していたが、そのに、出すメッセージを種類わけして表示のON,OFFを切り替えたくなった

■最初とった方法
  #defineでデバッグメッセージの表示を切り替えることが目的です。



#define DBGPRNT_X
#define DBGPRNT_Y

class CDebug
{
public:

// X関連
#ifdef DBGPRNT_X
printX( char *format)
{
printf(format);
}

printX_d( char *format, int parm0 )
{
printf(format, parm0);
}

printX_f( char *format, float parm0 )
{
printf(format, parm0);
}

printX_ff( char *format, float parm0, float parm1 )
{
printf(format, parm0, parm1);
}
#else
printX( char *format) { }
printX_d( char *format, int parm0 ) { }
printX_f( char *format, float parm0 ) { }
printX_ff( char *format, float parm0, float parm1 ) { }
#endif


// Y関連
#ifdef DBGPRNT_X
printY( char *format)
{
printf(format);
}

printY_d( char *format, int parm0 )
{
printf(format, parm0);
}

printY_dd( char *format, int parm0, int parm1 )
{
printf(format, parm0, parm1);
}

printX_ff( char *format, float parm0, float parm1 )
{
printf(format, parm0, parm1);
}
#else
printY( char *format) { }
printY_d( char *format, int parm0 ) { }
printY_dd( char *format, int parm0, int parm1 ) { }
printX_ff( char *format, float parm0, float parm1 ) { }
#endif

};

うーん・・必要な引数分どんどん必要になる・・・


■可変引数の方法

そこで、いよいよ、可変引数を使ってみることに以外に簡単だった・・
でも、まだよくわかってないけど

#define DBGPRNT_X
#define DBGPRNT_Y

#ifdef DBGPRNT_X
void dbgPrintX( char *format, ...)
{
va_list arg;
va_start(arg, format);
vsprintf(buf_, format, arg);
va_end(arg);

printf(buf_);

return;
};
#else
void dbgPrintX( char *format, ...)
{
}
#endif


#ifdef DBGPRNT_Y
void dbgPrintY( char *format, ...)
{
va_list arg;
va_start(arg, format);
vsprintf(buf_, format, arg);
va_end(arg);

printf(buf_);

return;
};
#else
void dbgPrintY( char *format, ...)
{
}
#endif

綺麗にできた!!
スポンサーサイト

comment

Secret

今日も仕事で可変引数を調べることに

以下のページを参考にしました。

http://www.paw.hi-ho.ne.jp/takadayouhei/technic/17.html

http://wisdom.sakura.ne.jp/programming/c/c62.html

■ポイント1
void va_start(va_list リスト , prev);

リストには、引数リストへのポインタを指定します
これは、可変個の引数の情報を保持するための stdarg.h で定義されている標準型です
pervは、最初の可変個数の手前の固定引数を指定します(最後の固定引数)


■ポイント2
va_arg関数の第2引数は引数の型です。もし、 myfunc( "test" , 100 ); という形で関数myfuncを呼び出したのならば、va_arg( ap , int );で「100」という数字を得、 myfunc( "test" , "go" ); という形で関数呼び出したのならば、 va_arg( ap , char* ); で「"go"」という文字列を得る必要があります。
 
これはつまり、引数の型があらかじめわかっていなければいけないという事です。

プロフィール

syarekoube

Author:syarekoube
しゃれこうべとあずいの2人によるブログです。
主にアクションゲーム制作について発表しています。
あと、数学の研究です。

カテゴリー
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

ブログ内検索
RSSフィード
リンク