2016-08-17 1 views
-1

void dbgLog (tDbgLog *dbg, const char *mod, const char *func, const char *format,...)vsnprintf()の使用は別の関数を呼び出すことによって、それがアクセスできるようになりますが、私が試した次が、それは正常に動作していないよう:どのように私は正しくargsの動的数を持つ関数をラップするのですか?私がどのように見える機能ラップしたい

void pMonDbgLog(const char *mod, const char *func, char* fmt, ...) 
{ 
    va_list args; 
    va_start(args,fmt); 
    dbgLog(g_pdbg,mod,func,fmt,args); 
    va_end(args); 
} 

私は再びこれを次のマクロを通してアクセス可能にします:#define gDbgLog(fmt,...) pMonDbgLog(MODULE_NAME,__FUNCTION__,fmt, ##__VA_ARGS__)しかし、私の議論が台無しになることが判明しました。なぜこれは、私は疑問に思っていますか?

答えて

0

vararg関数の引数を別のvararg関数に渡す移植可能な方法はありません。あなたはとして定義された関数を呼び出すことによってvdbgLogdbgLogを実装することができます

void vdbgLog(tDbgLog *dbg, const char *mod, const char *func, 
      const char *format, va_list ap) { 
    /* your implementation goes here */ 
} 

void dbgLog(tDbgLog *dbg, const char *mod, const char *func, const char *fmt, ...) { 
    va_list args; 
    va_start(args, fmt); 
    vdbgLog(dbg, mod, func, fmt, args); 
    va_end(args); 
} 

をそして、あなたは同様にpMonDbgLogから直接この機能vdbgLogを呼び出すことができます。

void pMonDbgLog(const char *mod, const char *func, char *fmt, ...) { 
    va_list args; 
    va_start(args, fmt); 
    vdbgLog(g_pdbg, mod, func, fmt, args); 
    va_end(args); 
} 
3

機能dbgLogは省略記号を経由してva_list型ではなく、可変引数の引数を取る必要があります。

void dbgLog(tDbgLog*dbg, const char *mod, const char *func, const char *format, va_list list) 
                       ^^^^^^^ 

引数リストを、機能dbgLogで、その後、vsnprintfを関数に渡されます。

関連する問題