1

按照设计,Q_ASSERT不会导致应用程序在发布模式下失败。我的问题是里面的代码Q_ASSERT仍然在发布模式下运行吗?

bool assertTest()
{
    int x = 0;
    Q_ASSERT(++x);
    return x == 1;
}

在发布模式下会assertTest()返回与调试模式下不同的值吗?

4

2 回答 2

2

Qt文档指出

如果在编译期间定义了 QT_NO_DEBUG,Q_ASSERT 什么也不做。

此外,它警告如果断言Q_ASSERT被禁用,则不会执行条件。

Q_ASSERT(), Q_ASSERT_X(),如果在编译期间定义,Q_CHECK_PTR()则展开为 空。因此,这些宏的参数不应该有任何副作用。这是 的错误用法:QT_NO_DEBUGQ_CHECK_PTR()

char *alloc(int size) 
{
    char *ptr;
    Q_CHECK_PTR(ptr = new char[size]);  // WRONG
    return ptr; 
}
于 2013-06-12T18:21:03.173 回答
1

断言表达式中的副作用几乎总是一个错误。在合格的代码审查和/或使用静态分析工具时,它们应该被标记。Q_ASSERT 做什么并不重要,无论如何依赖它都是不好的——即使你知道它做什么。

于 2013-06-12T19:11:08.043 回答