簡體   English   中英

如何在編譯期間檢查信號/插槽連接?

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

在運行時檢查Qt信號插槽連接調用是我的擔心。 我應該可以運行connect語句的靜態檢查。

這樣的工具存在嗎?

使用QT5,您可以使用以下語法,該語法在編譯時進行靜態檢查:

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

這樣的工具存在嗎?

如果存在這樣的工具會很好,但遺憾的是它不存在,因為信號/槽機制在qt中實現的方式。 而且,由於這個原因,不可能靜態地檢查信號是否適合插槽。

如果qt使用像boost的信號/插槽這樣的話就有可能。

您可以考慮在C中創建GCC插件,或者使用MELT擴展,MELT是一種特定於域的語言,可以輕松編寫GCC擴展。 使用插件或MELT擴展,您可以分析內部表示(特別是表示C ++類和函數聲明的Tree-s)並為此創建一個特定的工具。

但是,擴展海灣合作委員會需要了解其相當復雜的內部代表性,並且對於不了解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()調用。 它對你有幫助嗎?

為了使用大型Qt4代碼庫,我為clang靜態分析器編寫了這樣的檢查器作為插件

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

測試范圍的例子:

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

您無法在編譯時檢查此項,但如果您在Qt Creator中以調試模式運行程序,則如果connect調用失敗,它將在Application Ouptut窗格中打印一條有用的診斷消息。 在這里看到我的答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM