2016-10-03 26 views
0

va_メソッドに問題があり、例が見つからない(またはキーワードの内容がわからなかった)。 va_startc可変関数、同じ引数、異なる書式

エラーの

間違った使い方を:問題は、私は、異なるフォーマットのために同じ引数を使用する必要がありますが、コンパイラは私に与え、です。私が試しているコードは次のようなものです:

void vSaveNecessaryFields(EnumA eFormat, ...) 
{ 
    va_list xArgs, xArgs2; 
    const char *fmt1 = NULL, *fmt2 = NULL; 
    char caString[100] = {0}; 

    fmt1 = cpGetDbFormat(eFormat); 
    fmt2 = cpGetPrinterFormat(eFormat); 

    va_start(xArgs1, fmt1); 
    va_copy(xArgs2, xArgs1); 
    vsnprintf(caString, sizeof(caString), fmt1, xArgs1); 

    vSaveToDb(caString); 

    va_start(xArgs2, fmt2); 
    vsnprintf(caString, sizeof(caString), fmt2, xArgs2); 
    vPrintFormatted(caString); 
    va_end(xArgs2); 
    va_end(xArgs1); 
} 

どうすればこの問題を解決できますか?

+0

'va_startマクロ(xArgs1、FMT1)' - > 'のva_start(xArgs1、eFormat)' – LPs

+0

今それをしようとしています。誰がこれを棄却したのですか? –

+0

それは働いた。答えとして書くと私はそれを受け入れます。 –

答えて

2

va_startへの引数は、eFormat引数である必要があります。さらに、va_listxArgsと宣言されていますが、xArgs1を使用すると、構文エラーが発生します。

void vSaveNecessaryFields(EnumA eFormat, ...) { 
    va_list xArgs, xArgs2; 
    const char *fmt1 = NULL, *fmt2 = NULL; 
    char caString[100] = {0}; 

    fmt1 = cpGetDbFormat(eFormat); 
    fmt2 = cpGetPrinterFormat(eFormat); 

    va_start(xArgs, eFormat); 
    vsnprintf(caString, sizeof(caString), fmt1, xArgs); 
    va_end(xArgs); 

    vSaveToDb(caString); 

    va_start(xArgs2, eFormat); 
    vsnprintf(caString, sizeof(caString), fmt2, xArgs2); 
    vPrintFormatted(caString); 
    va_end(xArgs2); 
} 
+0

'xArgs - > xArgs1'は私がコードを簡略化したときの私のタイプミスでした:) –

0

パラメータブロックを閉じた後、va_endを呼び出してから、もう一度va_startを呼び出す必要があります。

+0

もしva_end xArgs1ならxArgs2もクリアされませんか? –

関連する問題