我有一个基于 printf
格式的日志记录框架:
void Logger::debug(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
this->output(DebugLevel, fmt, args);
va_end(args);
}
如果Logger::output
抛出异常,编译器会正确地解开堆栈,还是我需要在catch子句中添加try/catch块,并在其中加入va_end(args)
?这可以被RAII化吗,还是va_end
对此来说太神奇了?如果可能,请包含对标准的引用。
va_*
标识符是宏。 - Alexandre C.va_start()
,都必须在可变参数函数内部使用va_end()
。请注意,如果您计划记录大量内容,则try-catch会显着降低性能。 - Eitan T