[英]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_MACRO
的Q_OBJECT
。 從Qt參考文檔 :
moc工具讀取C ++頭文件。 如果找到一個或多個包含Q_OBJECT宏的類聲明,它將生成一個C ++源文件,其中包含這些類的元對象代碼。
我的建議是,不要這樣。
您確定在手動“編寫宏的內容”時,所編寫的代碼與宏擴展產生的代碼完全相同嗎?
在我看來,SIGNAL_MACRO 聲明了testSignal()
函數,但未定義該函數,即函數沒有主體,這肯定會導致您看到的錯誤。
但是,很難從代碼中分辨出來,因為使用宏會使事情變得混亂。 我建議您不要以這種方式使用宏,因為它會使代碼很難閱讀和理解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.