c++ - 如何在 C++ 11/14 中实现类型安全且无需宏的运行时调试断言?

标签 c++ c++11 macros assertion

在如下上下文中使用的断言:

ASSERT(dynamic_cast<Derived*>(_ptr));
ptr = static_cast<Derived*>(ptr);

因此,在调试过程中,断言将检查动态转换,但在 Release模式下将被删除。 (标准断言行为)

如何在不使用宏的情况下实现此功能。我的想法是:

void ASSERT(bool _arg)
{
    if(!_arg)
        //something
}

但是,这并不能确保类型安全。此外,我正在考虑对此有两种实现,一种是空的(用于发布,因此 ASSERT 函数不执行任何操作),另一种是使用上面的代码进行调试。此方法还依赖于编译器优化空函数,这并不总是可靠的。

因此,最好的方法是什么?或者宏是绝对必要的......?

最佳答案

为此目的使用宏相对于函数的好处正如您所说,检查有可能不会完全优化,并且您仍然需要为dynamic_cast付费。

您最好的选择是使用assert(dynamic_cast<Derived*>(_ptr) != nullptr) 。类型安全不会为您带来任何类似于断言的行为。

如果一定要自己写函数,可以有条件调用std::abort来自<cstdlib> header ,但您必须自己添加任何诊断信息。

关于c++ - 如何在 C++ 11/14 中实现类型安全且无需宏的运行时调试断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30233733/

相关文章:

c - Macro 的类型转换以优化代码

c++ - 如何使 double 始终保留三位小数? C++

qt - 在 qt creator(mingw 4.8 和 qt 5.3)中使用 c++11 功能时出现奇怪的错误

c# - 如何在 Visual C++ 中使用使用 C# 创建的 dll?

c++ - 与 C++11 lambda 相比,bind() 是否有任何优势(除了兼容性)?

c++ - 当我使用 C++11 兼容编译器编译 boost 1.48\1.47 代码时,我最终会得到像 share_ptr 这样的东西的标准实现吗?

c - 如何编写获取函数运行时间的宏?

macros - nim - 自定义宏/pragma 以获取完整模块但获取 "cannot attach a custom pragma"

C++ 预处理器定义

c++ - 输出字符串用 C++ 在 Linux 中覆盖终端上的最后一个字符串