我在一个有这个签名的类中有一个方法:
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 );
}
谢谢!
答案 0 :(得分:2)
这种方式不可能(没有宏),你必须改变原来的功能才能获得va_list
。
答案 1 :(得分:0)
宏可以在一行中解决这个问题:
#define debugMsg(appender,msg,...) addMessage(appender,LOGLEVEL_DEBUG, msg, __VA_ARGS__)
或者,您必须按照here的说明使用va_list
,va_start
和va_end
。