QtApplets-Q_ASSERT使用

Posted DreamLife.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QtApplets-Q_ASSERT使用相关的知识,希望对你有一定的参考价值。

QtApplets-Q_ASSERT使用

​ 今天又学习了一个知识点,Q_ASSERT,神奇的宏,这个只有在**Debug**模式下才会生效的。主要功能就是在我们需要的位置使用该宏,在程序出错的地方,就会直接告诉我们出错的位置,对于大型项目来说,简直就是Debug利器。


关键字: Q_ASSERT_X调试断言Q_ASSERTQT_NO_DEBUG

1 Q_ASSERT

​ 先看第一个Q_ASSERT源码如下:

Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line) noexcept;

#if !defined(Q_ASSERT)
#  if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
#    define Q_ASSERT(cond) static_cast<void>(false && (cond))
#  else
#    define Q_ASSERT(cond) ((cond) ? static_cast<void>(0) : qt_assert(#cond, __FILE__, __LINE__))
#  endif
#endif

void Q_ASSERT(bool test)当表达式为false是,打印出警告信息。测试代码如下

void MainWindow::on_pushButton_clicked()
{
    int a = 1;
    int b = 2;
    int c = a + b;

    Q_ASSERT(c == 5);

    qDebug() << "Test 1";
}

演示效果如下:

2 Q_ASSERT_X

Q_ASSERT_X源码如下:

Q_CORE_EXPORT void qt_assert_x(const char *where, const char *what, const char *file, int line) noexcept;

#if !defined(Q_ASSERT_X)
#  if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
#    define Q_ASSERT_X(cond, where, what) static_cast<void>(false && (cond))
#  else
#    define Q_ASSERT_X(cond, where, what) ((cond) ? static_cast<void>(0) : qt_assert_x(where, what, __FILE__, __LINE__))
#  endif
#endif

void Q_ASSERT_X(bool test, const char *where, const char *what)当test为false是,打印警告信息,并包含自定义信息,示例代码如下:

void MainWindow::on_pushButton_2_clicked()
{
    int a = 1;
    int b = 2;
    int c = a + b;

    Q_ASSERT_X(c == 5,"Error","Error Test 1");

    qDebug() << "Test 1";
}

演示效果如下:

3 二者对比

​ 这两个宏都是在我们传入的值为false的时候触发,都会打印信息,只是Q_ASSERT_X支持打印我们自定义的信息。

4 特别注意

​ 不论是Q_ASSERT也好Q_ASSERT_X也罢,都是在Debug才生效的,在Release版本中,将被自动优化掉如下图所所示

4 参考链接

​ 搬运链接:

https://blog.csdn.net/y363703390/article/details/79790716

https://blog.csdn.net/hats8888/article/details/54171298

https://blog.csdn.net/xgbing/article/details/7789950

☞ 源码

源码链接:GitHub仓库自取

使用方法:☟☟☟


以上是关于QtApplets-Q_ASSERT使用的主要内容,如果未能解决你的问题,请参考以下文章

webstorm代码片段的创建

VIM 代码片段插件 ultisnips 使用教程

Android课程---Android Studio使用小技巧:提取方法代码片段

使用 Git 来管理 Xcode 中的代码片段

如何在 Javadoc 中使用 @ 和 符号格式化代码片段?

使用 Pygments 检测代码片段的编程语言