gpt4 book ai didi

c++ - 有什么方法可以避免为这个 C++ 范围的记录器使用宏?

转载 作者:行者123 更新时间:2023-12-03 21:42:07 26 4
gpt4 key购买 nike

我正在将诊断库中的一些非常旧的代码更新为现代 C++,还有一段代码一直困扰着我。它是一种非常常见的作用域日志函数,它使用宏来定义特定应用程序槽中日志数据的存储,这里简化为一个 int,带有一个可选版本,该版本采用一个条件,用于决定是否计时应该发生(例如,对于特定情况,例如第一次通过循环,或者在极端的人为外部时序压力下)。

class ScopedTimer
{
int mSlot;
bool mCondition;
Ticker mBeginTimer;
public:
ScopedTimer( int slot, bool condition ) :
mSlot( slot ),
mCondition(condition)
{
if ( mCondition ) mBeginTimer = GetTimer();
}

~ScopedTimer()
{
if (mCondition)
{
StoreInSlot( mSlot, GetTimer() - mBeginTimer );
}
}
};

#ifdef PROFILING_ENABLED
#define ST_NAME_CONCAT( x, y ) x ## _ ## y
#define ST_NAME_EVALUATOR( x, y ) ST_NAME_CONCAT( x, y )
#define ST_NAME( prefix ) ST_NAME_EVALUATOR( prefix, __LINE__ )
#define SCOPED_TIMER(slot) ScopedTimer ST_NAME(scopedTimer)( slot, condition )
#else
#define SCOPED_TIMER(slot) // goes away in release
#endif
并在使用中:
extern bool ConditionRequestsTiming();

void foo()
{
SCOPED_TIMER( some_magic_slot_number, ConditionRequestsTiming() );

... other operations

}
扩展到
void foo()
{
ScopedTimer scopedTimer12( some_magic_slot_number, ConditionRequestsTiming() );

... other operations

// calling ~ScopedTimer() here, but only if ConditionRequestsTiming was true, storing time difference in the slot
}
并在发布中:
void foo()
{
... other operations
}
这当然按预期工作,为该方法提供了一个范围计时器。它非常方便,而且不易出错,但它不尊重命名空间,这一直困扰着我。
关于没有太多复杂性的现代解决方案的任何想法,或者我应该接受这种模式对我们的诊断库来说是好的吗?

最佳答案

通常人们使用宏来追加 __LINE__到声明以允许在一个范围块中进行多个声明。
在 C++20 之前,如果没有宏,这是不可能的。 C++20 及更高版本,稍加工作,即可使用 std::source_location .
Jason Turner 在他的 C++ 每周视频系列 here 中有一个关于它的视频。

关于c++ - 有什么方法可以避免为这个 C++ 范围的记录器使用宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66948897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com