gpt4 book ai didi

c++ - Q_ASSERT 发布构建语义

转载 作者:可可西里 更新时间:2023-11-01 15:36:06 24 4
gpt4 key购买 nike

我找不到关于发布版本下 Q_ASSERT 语义的明确声明。如果没有断言检查,那么是否对断言表达式进行求值?

考虑以下代码

Q_ASSERT(do_something_report_false_if_failed());

do_something_report_false_if_failed() 是否会在所有可能的 Qt 构建配置下运行?这样做会更安全吗(即使有点冗长且可读性较差):

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 未在特定构建配置中定义,但这不是一个好主意™。

关于c++ - Q_ASSERT 发布构建语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12573230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com