Q_ASSERT详解
- 引言
- 一、基本用法
- 二、深入了解
- 三、参考链接
引言
Q_ASSERT
是 Qt 框架中的一个宏,用于在调试时检查某个条件是否为真。它是程序调试中的一个重要工具,有助于开发者在开发过程中及时发现并修复潜在的错误。
一、基本用法
只在使用 Qt 的 Debug 版本时才会执行,在使用 Qt 的 Release 版本编译程序时,Q_ASSERT
宏会被编译器优化掉,不会产生任何代码。由于 Q_ASSERT 宏在 Release 版本中会被优化掉,因此它不应该用于控制程序的正常流程。如果需要在发布版本中也执行某些检查,应该使用其他机制(如异常处理 或 打印相关错误日志)。
-
- 用法:
Q_ASSERT(bool test)
当test
为真时,Q_ASSERT 宏不做任何操作;当test
为假时,Q_ASSERT 宏会在控制台输出错误信息,并中止程序的执行。
- 用法:
-
Q_ASSERT_X
宏 (Q_ASSERT_X(bool test, const char *where, const char *what)
)
与Q_ASSERT用法一致,通过where
和what
可以自定义输出的错误信息。
二、深入了解
-
- 以
Q_ASSERT(bool test)
为例,查看相关源码,在qglobal.h
中:
- 以
#if !defined(Q_ASSERT)
# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
# define Q_ASSERT(cond) static_cast<void>(false && (cond))
# else
# define Q_ASSERT(cond) ((cond) ? static_cast<void>(0) : qt_assert(#cond, __FILE__, __LINE__))
# endif
#endif
可以看到,在Qt Debug模式下,如果为真,执行static_cast<void>(0)
,否则执行qt_assert(#cond, __FILE__, __LINE__))
:
Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line) Q_DECL_NOTHROW;
-
- 深入
qt_assert
函数,在qglobal.cpp中
:
- 深入
void qt_assert(const char *assertion, const char *file, int line) noexcept
{QMessageLogger(file, line, nullptr).fatal("ASSERT: \"%s\" in file %s, line %d", assertion, file, line);
}
使用QMessageLogger
输出的信息,使用.fatal
默认其实用的是qFatal()
。
三、参考链接
Qt Assert 官方文档
Qt程序调试之Q_ASSERT断言
Q_ASSERT的详细介绍 - 这篇博还介绍了诸如Q_ASSERT_RELEASE
的宏,Qt5中没有见过,不确定是否正确
QT断言功能应用