[Development] QLog ( Work on qDebug and friends)

kai.koehne at nokia.com kai.koehne at nokia.com
Tue Feb 14 15:31:59 CET 2012


> -----Original Message-----
> From: development-bounces+kai.koehne=nokia.com at qt-project.org
> [mailto:development-bounces+kai.koehne=nokia.com at qt-project.org] On
> Behalf Of ext BRM
> Sent: Tuesday, February 14, 2012 3:00 PM
> To: development at qt-project.org
> Subject: Re: [Development] QLog ( Work on qDebug and friends)
> 
> ----- Original Message -----
> 
> > From: "kai.koehne at nokia.com" <kai.koehne at nokia.com>
> >>  -----Original Message-----
> >>  From: development-bounces+kai.koehne=nokia.com at qt-project.org
> >>  [mailto:development-bounces+kai.koehne=nokia.com at qt-project.org]
> On
> >> Behalf Of Ramsay Lincoln (Nokia-MP/Brisbane)
> >>  Sent: Monday, February 13, 2012 1:33 AM
> >>  To: development at qt-project.org
> >>  Subject: Re: [Development] QLog ( Work on qDebug and friends)
> >>
> >>  On 02/11/2012 01:44 AM, ext kai.koehne at nokia.com wrote:
> >>  > However, adding yet another 'keyword' to the framework has a
> > price,
> >>  > especially since the difference between  >
> >> 'qDebug(QMessageLogContext("MyCategory"))'<<
> > and a
> >>  > 'qLog("MyCategory")<< ' is subtle.
> >>
> >>  We tried that but while this difference is subtle to the eye, it's a
> >> huge difference to the implementation.
> >>
> >>  qDebug is currently an argument-less macro that expands to the name
> >> of a  function. Before message logging it was just a plain old function.
> >>  Overloading means that qDebug("message") and qDebug() <<
> > "message"
> >>  both
> >>  work.
> >>
> >>  Since we can't have a macro func with 0, 1 or many arguments, we can
> >> only add a new overload for qDebug(category) << "message"
> > but if we do
> >>  this, there is nowhere to put the "do nothing quickly" logic.
> >
> >
> > Just wanted to point out that there are variadic macros:
> > http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html
> >
> > #define qCategoryDebug(category, ...) if (isLogEnabled(category))
> > QMessageLogger(__FILE__, __LINE__,
> Q_FUNC_INFO).debug(__VA_ARGS__)
> >
> > Seems to work with at least gcc4.2.1 and Visual studio 2010.
> >
> > But that doesn't help with the fact that we can't differentiate
> > between 'qDebug()', 'qDebug("Hello world")', and 'qDebug(MyCategory)'
> > on the macro level.
> 
> 
> That depends on implementation. It does allow you take all those args and
> pass them over to other function easily.
> And if all categories have to be registered, then you can add a check against
> the registration for it:
> 
> ..
> qLogRegisterCategory("my category");
> ...
> qDebug("my category",...");
> ...
> qDebug(...);
> ...
> 
> #define qDebug(category,...) \
>     if (qLogIsCategory(category))    \
>         if (qIsLogEnabled(category))   \
>             QMessageLogger(__FILE,__LINE__, Q_FUNC_INFO,
> category).debug(__VAR__ARGS__)    \
>         else {} \
>     else QMessageLogger(__FILE,__LINE__,
> Q_FUNC_INFO).debug(category,##__VAR__ARGS__)

Nice, though it'll break with

qDebug() << "Hi there";

"too few arguments to function bool qLogIsCategory(const char*)"

Also this won't work:

qDebug("category") << "HI there";

"expected primary expression before the '<<' token.

:(

Regards

Kai



More information about the Development mailing list