如何使用可变数量的参数别名一个函数?

时间:2011-04-21 10:14:43

标签: c++

我在一个有这个签名的类中有一个方法:

void addMessage_( std::string appender, LogLevel level /*= LOGLEVEL_INFO*/, char* msg, ... );

我想以这种方式创建此方法的'别名':

void debugMsg( std::string appender, char* msg, ... ){
    addMessage(appender, LOGLEVEL_DEBUG, msg, ...);
}

我的问题是:我是否需要扩展args来调用addMessage方法?我不想复制我的每个实用方法的代码,但我不想浪费性能。什么是最好的解决方案?

解决:我让我的解决方案作为文档:

void DEBUG_MSG(std::string appender, char* msg, ...){
    va_list argptr;
    va_start(argptr,msg);
    addMessage_(appender, LOGLEVEL_DEBUG, msg, argptr);
    va_end(argptr);
}

addMessage_方法:

    void CGlobalLog::addMessage_( std::string appender, LogLevel level, char* msg, va_list args ){

    int     len;
    char    *buffer;

    len = _vscprintf( msg, args ) // _vscprintf doesn't count
        + 1; // terminating '\0'

    buffer = (char*)malloc( len * sizeof(char) );

    vsprintf( buffer, msg, args ); // C4996
    // Note: vsprintf is deprecated; consider using vsprintf_s instead
    addMessage(buffer,appender,level);

    free( buffer );
}

谢谢!

2 个答案:

答案 0 :(得分:2)

这种方式不可能(没有宏),你必须改变原来的功能才能获得va_list

这里有完整的解释:Passing variable number of arguments around

答案 1 :(得分:0)

宏可以在一行中解决这个问题:

#define debugMsg(appender,msg,...)    addMessage(appender,LOGLEVEL_DEBUG, msg, __VA_ARGS__)

或者,您必须按照here的说明使用va_listva_startva_end