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

9
在运行时检查Qt信号槽连接对我来说是一个担忧。应该可以对connect语句进行静态检查。
是否有这样的工具存在?

4
这个工具是Qt 5:http://woboq.com/blog/new-signals-slots-syntax-in-qt5.html :) - mlvljr
1
@mlvljr 我几周前确实读过这篇文章,很棒,但是我需要改变很多代码才能获得好处。 - Phil Hannent
6个回答

6
使用QT5,您可以使用以下语法,在编译时进行静态检查:
connect(sender, &Sender::signalMethod,  receiver, &Receiver::slotMethod);

3

有这样的工具吗?

如果有这样的工具就太好了,但很遗憾它并不存在,因为信号/槽机制是在qt中实现的。另外,由于这个原因,无法静态检查信号是否适用于槽。

如果qt使用类似boost的信号/槽机制,那么就可能存在这种工具。


你能详细说明为什么不可能吗?如果有完整的源代码树,我认为我应该可以比较信号和槽。确实,我需要同时查看多个文件,但这仍然是可能的。 - Phil Hannent
@PhilHannent 这个页面 描述了QT的信号/槽机制。在某些限制下是可行的(例如,在SIGNAL和SLOT中使用错误的签名)。当然,你可以编写自己的工具来实现它,但是QT的当前实现并没有这样做。 - BЈовић

2
您可以考虑使用C编写GCC插件或MELT扩展。MELT是一种领域特定语言,可轻松编写GCC扩展。使用插件或MELT扩展,您可以分析内部表示(特别是表示C++类和函数声明的树),并制作一个特定的工具。
然而,扩展GCC需要理解其相当复杂的内部表示,并且对于不了解GCC内部的人来说,需要超过一周的努力。
也许这样的努力不值得,除非您的Qt应用程序真的很大。如果您考虑在此方面使用MELT,我很乐意帮助您。

2

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

  #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()调用。这对你有帮助吗?

2
这是运行时,而不是编译时。-1 - weberc2
@weberc2,你知道有没有编译时的解决方案吗?发一下吧。你看过这些帖子吗? - UmNyobe
1
@UmNyobe 是的,我读了帖子。你读了问题吗? ;) 不,我不知道编译时的解决方案(这就是我读你的答案的原因!)。 :) - weberc2

1

你无法在编译时检查此问题,但如果在Qt Creator中以调试模式运行程序,则会在应用程序输出窗格中打印有用的诊断消息,如果connect调用失败。请参见我在这里的回答


我并不是字面上的编译时,而是作为运行的工具的一部分(如qmake、nmake/make、cppcheck等)。我已经输出了应用程序消息,但是如果您有动态创建的对象,则测试会更加困难,因为您必须确保每次进行验收测试时都至少创建一个这些对象。 - Phil Hannent

1

为了处理大型Qt4代码库,我编写了一个插件作为clang静态分析器的检查器。

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

测试覆盖率示例:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接