加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – Q_ASSERT发布构建语义

发布时间:2020-12-16 05:41:50 所属栏目:百科 来源:网络整理
导读:在发布版本下,我找不到关于Q_ASSERT语义的清晰语句.如果没有断言检查,则所声明的表达式是否被评估? 请考虑以下代码 Q_ASSERT(do_something_report_false_if_failed()); 在所有潜在的Qt构建配置下,do_something_report_false_if_failed()是否运行?这样做会
在发布版本下,我找不到关于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,但这不是一个好主意.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读