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

How to aliase a function with variable number of arguments?

本文关键字:函数 一个 别名 参数 何用可      更新时间:2023-10-16

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

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

我想用这种方式创建这个方法的别名:

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

我的问题是:我需要扩展参数调用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 ''
    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 );
}

谢谢!

这是不可能的(没有宏),你必须改变你的原始功能,以一个va_list

周围传递可变数量的参数

宏可以只用一行就解决这个问题:

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

或者,您必须使用va_list, va_startva_end,如这里所述。

相关文章: