c – Q_ASSERT发布构建语义

前端之家收集整理的这篇文章主要介绍了c – Q_ASSERT发布构建语义前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在发布版本下,我找不到关于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中的表达式进行评估.

考虑下面Qt repo的源代码.

#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,但这不是一个好主意.

原文链接:https://www.f2er.com/c/113975.html

猜你在找的C&C++相关文章