簡體   English   中英

從Qt4中的宏繼承

[英]Inheritance from macros in Qt4

我的部分代碼看起來像這樣。

#include <QObject>
#define MYMACRO : public QObject
#define SIGNAL_MACRO Q_OBJECT signals: void testSignal(std::string s);
#define EMIT_MACRO emit testsignal(s);

class myclass MYMACRO
{
   SIGNAL_MACRO
...

void myclass::method()
{
   std::string s("string");
   EMIT_MACRO
}

如果我將宏的內容寫入應該擴展的位置,則可以正常工作。 但是,如果我保留宏並讓預處理器執行該工作,則將得到“對myclass :: testSignal(std :: string)的未定義引用”。 我不知道有什么區別。 預處理程序應該在第一次遇到宏時對其進行擴展,就像我自己寫出它們一樣。 我以為我可以在宏中編寫任何內容,並且只需將其復制粘貼到需要的位置即可。

我認為這里的問題可能是Qt元對象編譯器在C ++預處理器之前運行,因此看不到SIGNAL_MACROQ_OBJECT Qt參考文檔

moc工具讀取C ++頭文件。 如果找到一個或多個包含Q_OBJECT宏的類聲明,它將生成一個C ++源文件,其中包含這些類的元對象代碼。

我的建議是,不要這樣。

您確定在手動“編寫宏的內容”時,所編寫的代碼與宏擴展產生的代碼完全相同嗎?

在我看來,SIGNAL_MACRO 聲明testSignal()函數,但未定義該函數,即函數沒有主體,這肯定會導致您看到的錯誤。

但是,很難從代碼中分辨出來,因為使用宏會使事情變得混亂。 我建議您不要以這種方式使用宏,因為它會使代碼很難閱讀和理解。

暫無
暫無

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

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