2016-08-12 7 views
1

関数でアクセスできるようにマクロをラップする必要があります。 マクロは次のように定義されています可変数の引数を持つマクロを折り返す

#define gDbgLog(fmt,...) dbgLog(g_pdbg,MODULE_NAME,__FUNCTION__,fmt,##__VA_ARGS__) 

と私は同じようにそれを包むしようとしました:

void pMonDbgLog(char* fmt, ...) 
{ 
    va_list args; 
    va_start(args,fmt); 
    gDbgLog(fmt,args); 
    va_end(args); 
} 

fmtは罰金を通ってくるように見える一方で、引数(int)がアップ上書きさ得るように見えます。私は好きそれを呼び出す:DbgLog("some text %d",x);のように直接マクロを呼び出すと、正常に動作している間

int x = 51144; 
pMonDbgLog("some text %d",x); 

と私が取得するには、「いくつかのテキスト642129608」です。どうしてこれなの?

dbgLog()出力を生成するためにvsnprintf()をラップします。引数の数が可変で

+0

マクロを直接呼び出すことができます(例: 'gDbgLog(some text%d"、x); ')。なぜ関数ラッパーが必要だと思いますか? – bgoldst

答えて

0

ラップマクロ

単に、少なくとも、実行時に可変長引数の関数にそれらを可変個の引数にvalist「を展開」と渡すことはできません追加のヘルパー(Cの一部ではなく、移植性がなく、実装/プラットフォームで利用できない可能性があります)ではありません。

gDbgLog()期待しを得て、各引数は別途を渡さ:

gDbgLog("%s %d", "hello, world", 42); 

何が示すコードではなく__VA_ARGS__一部、valistのすなわち値として正確にパラメータを渡しているん。これを解決する方法

gDbgLog(fmt,args); 

dbgLog()はvsnprintf()をラップして出力を生成します。

だからgDbgLog()をドロップすると、コードによって初期化しますが、表示さスニペットとして直接valistを渡すpMonDbgLog()からvsnprintf()を呼び出します。

関連する問題