2016-10-03 34 views
0

我遇到了va_方法的問題,我找不到一個示例(或者沒有弄清楚關鍵字是什麼)。問題是,我需要使用不同的格式相同ARGS,但編譯器給我:c可變參數函數,相同的參數,不同的格式

的va_start的不正確使用

錯誤。我想要的代碼是這樣的:

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

它的工作。把它寫成答案,我會接受它。如果我va_end xArgs1 –

回答

2

參數va_start應該是eFormat的參數。此外,va_list被聲明爲xArgs,但您使用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

,它不是也清除xArgs2? –