如何使用可变数量的参数来替换函数?
问题描述:
我有一类与此签名的方法:如何使用可变数量的参数来替换函数?
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);
}
谢谢!
答
宏可以解决,在短短一行:
#define debugMsg(appender,msg,...) addMessage(appender,LOGLEVEL_DEBUG, msg, __VA_ARGS__)
或者,你要利用va_list
,va_start
和va_end
作为解释here。
这正是我需要的。谢谢。 – Killrazor 2011-04-21 10:50:18