使用变量参数将变量参数从函数传递到另一个参数

时间:2015-06-18 22:00:13

标签: c++ windows variadic-functions

我有以下功能,我不应该更改为不破坏依赖项

void  Trace(
        __in DbgInfo dbgInfo,
        __in_z _Printf_format_string_ const WCHAR* pwszMsgFormat,
        ...) {

            // some code I need     
    };  

我需要它来调用一个也有... args:

的函数
#define TRACE_LINE(     format, ... ) _TRACE( LogLevelInfo ,format, __VA_ARGS__ )

#define _TRACE( mask, format, ... )  \
        ((mask) & g_LogLevel)              \
            ? TraceGlobal::TraceLine( mask, L"[" __FILEW__ L":" _BLOB_WIDE(_BLOB_STRINGIZE(__LINE__)) L"] "  L"MyService!" __FUNCTIONW__ L": " format , __VA_ARGS__ ) \
            : (void)0

void
ServiceTracing::TraceGlobal::TraceLine(
    _In_            LogLevel level,
    _In_z_          PCWSTR format,
    _In_            ...)
/**
Routine Description:

    Trace a formatted line with Level tracing

Arguments:

    level: enum level of trace line
    format: the string format
    ...: the variable arguments to be formatted

Return value:

    None
**/
{
    ASSERT(format);

    va_list args;
    va_start(args, format);

    // code does tracing

    va_end(args);

}

我该怎么做?

在上面的主要Trace功能中,我尝试了这个:

TRACE_LINE( pwszMsgFormat, __VA_ARGS__ );
然而,这没有用,我收到了错误:

 syntax error : missing ')' before identifier 'pwszMsgFormat'
 error C2059: syntax error : ')'

我假设因为它是宏__VA_ARGS__它给出了这个错误。

另一方面,我尝试直接调用TraceGlobal

va_list args;
va_start(args, pwszMsgFormat);
TraceGlobal::TraceLine(LogLevelInfo, pwszMsgFormat , args );
va_end(args);

这构建正常,但我在跟踪功能中遇到了分段错误/访问冲突,因为我还初始化va_list并使用va_start中的TraceLine

有没有一种简单的方法可以将变量参数从函数传递给另一个。我不想将Trace函数更改为Macro。

0 个答案:

没有答案