如何在编译期间检查信号/插槽连接?

How can I do a check of the signal/slot connect's during compilation?

本文关键字:信号 插槽 连接 检查 编译      更新时间:2023-10-16

在运行时检查Qt信号槽连接调用对我来说是一个问题。我应该能够对connect语句进行静态检查。

这样的工具存在吗?

使用QT5可以使用以下语法,在编译时进行静态检查:

connect(sender, &Sender::signalMethod,  receiver, &Receiver::slotMethod);

这样的工具存在吗?

如果这样的工具存在就好了,但不幸的是它不存在,因为信号/插槽机制在qt中实现的方式,而且,由于这个原因,不可能静态地检查信号是否适合插槽。

如果qt使用类似boost的信号/插槽,这是可能的。

您可以考虑用C编写一个GCC插件,或者一个MELT扩展,MELT是一种特定于领域的语言,可以很容易地编写GCC扩展。使用插件或MELT扩展,您可以分析内部表示(特别是表示c++类&函数声明),并为此创建一个特定的工具。

然而,扩展GCC需要理解其相当复杂的内部表示,对于不了解GCC内部表示的人来说,这将需要一个多星期的努力。

也许这样的努力是不值得的,除非你的Qt应用程序真的很大。如果您考虑在这方面与MELT合作,我很乐意帮助您。

我在我的代码中使用了这样的东西:

  #define CONNECT_OR_DIE(source, signal, receiver, slot,connection_type) 
    if(!connect(source, signal, receiver, slot,connection_type)) 
       qt_assert_x(Q_FUNC_INFO, "CONNECT failed!!", __FILE__, __LINE__);

我使用它来代替简单的connect()调用。它对你有帮助吗?

您不能在编译时检查这个,但是如果您在Qt Creator中以调试模式运行程序,如果connect调用失败,它将在应用程序输出窗格中打印有用的诊断消息。

为了处理大型Qt4代码库,我编写了这样的检查器作为插件对于clang静态分析器

看:http://reviews.llvm.org/D14592

it测试覆盖率示例:

    connect(&send, SIGNAL(f2(int, double*)), &recv, SLOT(bugaga(int, double*))); // expected-warning{{Can not find such slot}}