2011-04-21 176 views
0

我有一类与此签名的方法:如何使用可变数量的参数来替换函数?

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 '\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); 
} 

谢谢!

回答

0

宏可以解决,在短短一行:

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

或者,你要利用va_listva_startva_end作为解释here

相关问题