前言
在我们把自己的函数封装成库,然后给别人用时,别人很可能会看到我们库中使用qDebug()打印出来的信息。
这些信息一方面会干扰别人自己的输出,另一方面也会暴露我们自己库的一些细节。但是有时候又的确需要这些信息。
因此,最好有个开关来控制自己库的信息的打印。
这里,我是自己实现了一个debug类,用法也是类似qDebug()那样。仅供参考(推荐使用最新的)
V1版本
class ZyDebugPrivate{
public:
ZyDebugPrivate()
{
if(enablePrint == true)
{
mDebugPtr = new QDebug(qDebug());
}
}
~ZyDebugPrivate()
{
if(mDebugPtr != nullptr)
{
delete mDebugPtr; // 只有QDebug对象被析构时才会打印
}
}
static ZyDebugPrivate debug() // 这样就实现对象存活期只有一行
{
return ZyDebugPrivate();
}
template<typename T>
ZyDebugPrivate &operator << (T value)
{
if(enablePrint == false)
{
QNoDebug() << value;
// Q_UNUSED(var);
}
else
{
if(mFirst)
{
mDebugPtr->noquote() << QString("DynVision[%1]:").arg(QTime::currentTime().toString("hh:mm:ss.zzz")) << value;
}
else
{
*mDebugPtr << value;
}
}
mFirst = false;
return *this;
}
public:
static bool enablePrint;
private:
bool mFirst = true;
QDebug *mDebugPtr = nullptr;
};
bool ZyDebugPrivate::enablePrint = true;
#define ZyDebug ZyDebugPrivate::debug
V2版本
使用了智能指针,优化了代码结构
class ZyDebugPrivate{
public:
explicit ZyDebugPrivate(std::shared_ptr<QDebug> ptr)
{
mDebugSharedPtr = ptr;
}
template<typename T>
ZyDebugPrivate &operator << (T value)
{
if(enablePrint == false)
{
Q_UNUSED(value);
}
else
{
if(mFirst)
{
mDebugSharedPtr->noquote() << QString("cpp: [DynVision %1]:").arg(QTime::currentTime().toString("hh:mm:ss.zzz")) << value;
}
else
{
*mDebugSharedPtr << value;
}
}
mFirst = false;
return *this;
}
public:
static bool enablePrint;
private:
bool mFirst = true;
std::shared_ptr<QDebug> mDebugSharedPtr;
};
#define ZyDebug() ZyDebugPrivate(std::make_shared<QDebug>(qDebug()))
V3版本(存在静态变量的问题)
a.解决了静态变量的重复定义的问题,现在只要把该代码放到一个头文件即可。
b.解决了ZyDebugPrivate::enablePrint = false后,每次ZyDebug()后空一行的问题。
namespace ZyDebugPrivate{
static bool enablePrint = true;
class Private{
public:
explicit Private(std::shared_ptr<QDebug> ptr)
{
mPtr = ptr;
}
template<typename T>
Private &operator << (T value)
{
if(mPtr != nullptr)
{
if(mFirst)
{
mPtr->noquote() << QString("cpp: [DynVision %1]:").arg(QTime::currentTime().toString("hh:mm:ss.zzz")) << value;
}
else
{
*mPtr << value;
}
}
mFirst = false;
return *this;
}
private:
bool mFirst = true;
std::shared_ptr<QDebug> mPtr;
};
}
#define ZyDebug() ZyDebugPrivate::Private(ZyDebugPrivate::enablePrint ? std::make_shared<QDebug>(qDebug()) : nullptr)
V4版本
V3版本有静态变量的问题,导致无法通过修改enablePrint的值实现全局控制输出(只能控制某个文件范围)。所以,还是老老实实地声明一个类的静态成员变量,然后在cpp文件中定义及初始化吧。
class ZyDebugPrivate{
public:
explicit ZyDebugPrivate(std::shared_ptr<QDebug> ptr)
{
mPtr = ptr;
}
template<typename T>
ZyDebugPrivate &operator << (T value)
{
if(mPtr != nullptr)
{
if(mFirst)
{
mPtr->noquote() << QString("cpp: [MyLib %1]:").arg(QTime::currentTime().toString("hh:mm:ss.zzz")) << value;
}
else
{
*mPtr << value;
}
}
mFirst = false;
return *this;
}
static bool enablePrint;
private:
bool mFirst = true;
std::shared_ptr<QDebug> mPtr;
};
#define ZyDebug() ZyDebugPrivate(ZyDebugPrivate::enablePrint ? std::make_shared<QDebug>(qDebug()) : nullptr)
这句要拿到合适的地方去初始化,比如cpp文件中
//bool ZyDebugPrivate::enablePrint = true;
使用例程
使用:
ZyDebug() << "123" << "-----" << 78989 << 12.3;
输出信息为:
DynVision[16:20:4545.455]: 123 ----- 78989
假如需要关闭输出:
ZyDebugPrivate::enablePrint = false;