在发布版本下,我找不到关于Q_ASSERT语义的清晰语句.如果没有断言检查,则所声明的表达式是否被评估?
请考虑以下代码
Q_ASSERT(do_something_report_false_if_Failed());
在所有潜在的Qt构建配置下,do_something_report_false_if_Failed()是否运行?这样做会更安全(即使有点更冗长,更不可读)
bool is_ok = do_something_report_false_if_Failed(); Q_ASSERT(is_ok)
后一种方法的缺点是ASSERT失败比较冗长,但也许更清楚地表明语句被执行?
解决方法
在非调试版本配置中,不会对Q_ASSERT中的表达式进行评估.
#if !defined(Q_ASSERT) # ifndef QT_NO_DEBUG # define Q_ASSERT(cond) ((!(cond)) ? qt_assert(#cond,__FILE__,__LINE__) : qt_noop()) # else # define Q_ASSERT(cond) qt_noop() # endif #endif
如果定义了QT_NO_DEBUG,则将整个Q_ASSERT语句替换为qt_noop(),从而删除其以前包含的任何表达式.
不要依赖于在Q_ASSERT语句中由表达式创建的任何副作用.从技术上讲,仍然有可能确保在特定的构建配置中没有定义QT_NO_DEBUG,但这不是一个好主意.