2016-10-03 56 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? –