【发布时间】:2016-10-31 22:11:19
【问题描述】:
我正在为 QT 应用程序开发一个记录器框架。由于理解和学习的目的,我没有直接使用QMessageLogger。关于QMessageLogger 的一个功能,我真的很想在我的记录器中拥有一件事,但我不知道它是如何工作的。让我们以qDebug 宏为例:
#define qDebug QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).debug
可以通过两种方式调用此函数: 第一种方式:
qDebug("abc = %u", abc);
第二种方式:
qDebug() << "abc = " << abc;
我正在查看库代码,但我不太明白它是如何实现的,可以通过使用va_args 以及一些流对象来使用QMessageLogger。
我怎样才能达到这样的效果?我非常感谢所有帮助,如果有一个例子,我将不胜感激。
这是我的print 方法体。我需要通过“流”方式实现类似的功能:
/*!
* \brief Adds the log line to the print queue.
* \param lvl: Log level of the line.
* \param text: Formatted input for va_list.
*/
void CBcLogger::print(MLL::ELogLevel lvl, const char* text, ...)
{
// check if logger initialized
if (!m_loggerStarted)
return;
// check if log level sufficient
if (lvl > m_setLogLvl)
return;
logLine_t logline;
logline.loglvl = lvl;
logline.datetime = QDateTime::currentDateTime();
va_list argptr;
va_start(argptr, text);
char* output = NULL;
if (vasprintf(&output, text, argptr))
{
logline.logstr = output;
delete output;
}
va_end(argptr);
emit addNewLogLine(logline);
}
【问题讨论】:
-
旁注:如果您编写 C++11 并使用 C 的可变参数,那么您做错了。
-
我应该怎么做才合适?
-
不要使用可变参数。忘记它们的存在。参见例如this answer.
-
它不是类型安全的,在 C++11 中是不必要的。您不妨问“C 有什么问题”。
-
你链接到的文章探讨了这个问题,是的。