关于使用C预处理器生成唯一变量的问题,我知道该怎么做。我想要下一步:稍后重用名称。
我想有,例如,二define
名,STARTT
并且STOPT
,实际上启动一个定时器并停止它,这样我可以在整个项目只是作为使用同样的名字
// Get the cool STARTT/STOPT macros
#include "coolmacros"
myclass::myclass()
{
STARTT
// Do something
STOPT
}
void myclass::compute(double f, std::vector<double> &v)
{
STARTT
// Do something
STOPT
}
现在我只打印发生了如下情况
#define STARTT info(">>> START %s::%s", demangle(typeid(*this).name()).c_str(), __FUNCTION__);
#define STOPT info(">>> STOP %s::%s", demangle(typeid(*this).name()).c_str(), __FUNCTION__);
是否可以在宏中添加计时器,以便STOPT
知道STARTT
生成了什么符号,因此我可以添加以下内容:
#define STOPT info(">>> STOP %s::%s %d", demangle(typeid(*this).name()).c_str(), __FUNCTION__, GET_STARTT_TIMER().elapsed());
谢谢!
在C ++中,可以使用对象并依赖析构函数:
class TimerThing
{
public:
TimerThing(const char* name, const char* what, const char* where)
: start_time(something()),
m_name(name),
m_what(what),
m_where(where)
{
info(">>> START %s %s::%s", m_name, m_what, m_where);
}
~TimerThing()
{
info(">>> STOP %s %s::%s %d", m_name, m_what, m_where, elapsed());
}
private:
int elapsed() { /* whatever */ }
something start_time;
const char* name;
const char* m_what;
const char* m_where;
};
#define SCOPE_TIMER(x) TimerThing x(#x, demangle(typeid(*this).name()).c_str(), __FUNCTION__)
class Foo
{
public:
void f()
{
SCOPE_TIMER(f_timer);
{
SCOPE_TIMER(f_subtimer);
}
}
};
可能的输出:
>>> START f_timer Foo Foo::f
>>> START f_subtimer Foo Foo::f
>>> STOP f_subtimer Foo Foo::f 10
>>> STOP f_timer Foo Foo::f 12
(警告:具有完全虚构的计时功能的未经测试的代码。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句