Q_ASSERT语句中的代码是否在发布模式下执行?

时间:2013-06-12 17:38:27

标签: c++ qt assert

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

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

释放模式中assertTest()将返回与调试模式不同的值吗?

2 个答案:

答案 0 :(得分:2)

Qt文档states

  

如果在编译期间定义了QT_NO_DEBUG,则Q_ASSERT不执行任何操作。

此外,warns如果断言被禁用,则Q_ASSERT条件将不会被执行。

  如果,

Q_ASSERT()Q_ASSERT_X()Q_CHECK_PTR()扩展为空   编译期间定义了QT_NO_DEBUG因此,   这些宏的参数不应该有任何副作用。这是一个   错误使用Q_CHECK_PTR()

char *alloc(int size) 
{
    char *ptr;
    Q_CHECK_PTR(ptr = new char[size]);  // WRONG
    return ptr; 
}

答案 1 :(得分:1)

断言表达式中的副作用几乎总是错误的。在主管代码审查期间和/或使用静态分析工具时,应标记它们。 Q_ASSERT究竟做了什么并不重要,无论如何依赖它都是不好的 - 即使你知道它做了什么。