仅调试成员
Debug-only members
有没有一种很好的方法只在程序的调试版本中包含某些成员?
我有一个索引数据结构,我使用了大量的实例,这些实例带有一定的状态标志,以防数据结构的某些内容已更改,但索引尚未更新。
status 标志仅用于检查索引的所有使用是否在数据已更改的情况下调用update
功能,但出于性能和存储原因,由于有很多实例并且数据结构可能会在调用之前发生很多更改update
,我想仅保留此数据用于调试版本。
对这些标志基本上有两种类型的操作:
- 设置/重置标志
assert
标志未设置,即索引的某些部分仍然有效。
有没有比在我的代码中撒上#ifndef NDEBUG
语句更好的方法来实现这一目标?
注意:在我的特殊用例中,性能影响可能不是那么大,但我仍在寻找一种通用方法来解决这个问题,因为同一想法可能有更复杂的用例。
可以通过为基类提供调试功能来减少 #ifdefing 量:
class
t_MyDebugHelper
{
#ifdef NDEBUG
public: void
Set_Something(int value)
{
(void) value; // not used
}
public: void
Verify_Something(void)
{}
#else
private: ::std::string m_some_info;
private: int m_some_value;
public: void
Set_Something(int value)
{
m_some_value = value;
}
public: void
Verify_Something(void)
{
// implementation
}
#endif
};
class
t_MyClass
: public t_MyDebugHelper
{
public: void
SomeMethod(void)
{
t_MyDebugHelper::Verify_Something();
t_MyDebugHelper::Set_Something(42);
...
}
};
此方法不允许您完全摆脱 ifdef,但它允许在主代码逻辑中避免它们。在发布版本中,所有调试帮助程序函数都将导致 noop,并且由于空基类优化t_MyDebugHelper
类不会增加目标类大小。如果调试帮助程序需要访问t_MyClass
方法,则可以应用 CRTP。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 当回溯以零开始时,如何调试崩溃
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- GCC:在调试构建中优化的静态数据成员
- 在类声明中初始化 const 成员变量时在调试模式下出现异常
- 如何调试输出指向成员的指针
- 仅调试成员
- 如何在C++内联成员函数中添加Android调试函数(LOGE,LOGW..)
- 为什么 Visual Studio 2010 调试器看不到静态 const 类成员?
- 使用自动成员函数解决调试符号错误的方法
- 调试size_t不能作为数据成员工作的原因
- 用于Visual Studio调试器的类成员装饰
- 调试 WebSocket++ broadcast_server.cpp("owner_less"不是"std"的成员)
- 调试可视化工具在预览中使用成员方法/函数调用