包含 Q_OBJECT 的 C++ 宏
c++ macro containing Q_OBJECT
我正在开发一个包含多个插件的 c++/Qt 程序。
对于每个 class 我必须定义一个如下所示的插件界面:
//my class
class qwerty;
//my interface
class qwertyPlug : public QObject, myPlug {
Q_OBJECT
Q_INTERFACES(nPanPlug)
Q_PLUGIN_METADATA(IID "org.myapp.plug")
public:
qwertyPlug() {qRegisterMetaType<qwerty *>("qwerty""*");}
QByteArray name() {return "qwerty";}
};
我创建了一个宏(实际上是 2 个,因为我不是 C++ 预处理器大师):
#define MY_PLUGIN_BASE(__c_name,__appendix) \
class __c_name##__appendix : public QObject, myPlug { \
Q_OBJECT \
Q_INTERFACES(nPanPlug) \
Q_PLUGIN_METADATA(IID "org.myapp.plug") \
public: \
__c_name##__appendix() {qRegisterMetaType<__c_name *>(#__c_name"*");} \
QByteArray name() {return #__c_name;} \
};
#define MY_PLUGIN(__c_name) MY_PLUGIN_BASE(__c_name,Plug)
所以在我的代码中(定义 qwerty
的地方)我只需要添加:
MY_PLUGIN(qwerty)
这将展开(g++ -E
的输出):
class qwertyPlug : public QObject, myPlug { Q_OBJECT Q_INTERFACES(nPanPlug) Q_PLUGIN_METADATA(IID "org.myapp.plug") public: qwertyPlug() {qRegisterMetaType<qwerty *>("qwerty""*");} QByteArray name() {return "qwerty";} };
它看起来还不错(对于可读性很抱歉,但我不知道如何添加换行符..)如果 copy/paste 我的代码中的上述行但是...
当我编译我的项目时,我从 moc
:
中得到错误
Error: Class declaration lacks Q_OBJECT macro.
有人有想法吗?
事实证明,正如@Silicomancer 所建议的那样,您不能按原样进行。
我发现问题出在多行宏上,如果宏是单行的,它确实有效:
#define MY_PLUGIN_BASE(__c_name,__appendix) class __c_name##__appendix : public QObject, myPlug { Q_OBJECT Q_INTERFACES(nPanPlug) Q_PLUGIN_METADATA(IID "org.myapp.plug") public: __c_name##__appendix() {qRegisterMetaType<__c_name *>(#__c_name"*");} QByteArray name() {return #__c_name;} };
对我来说,看起来 moc 遍历文件寻找 Q_OBJECT
但不会混淆宏
我正在开发一个包含多个插件的 c++/Qt 程序。 对于每个 class 我必须定义一个如下所示的插件界面:
//my class
class qwerty;
//my interface
class qwertyPlug : public QObject, myPlug {
Q_OBJECT
Q_INTERFACES(nPanPlug)
Q_PLUGIN_METADATA(IID "org.myapp.plug")
public:
qwertyPlug() {qRegisterMetaType<qwerty *>("qwerty""*");}
QByteArray name() {return "qwerty";}
};
我创建了一个宏(实际上是 2 个,因为我不是 C++ 预处理器大师):
#define MY_PLUGIN_BASE(__c_name,__appendix) \
class __c_name##__appendix : public QObject, myPlug { \
Q_OBJECT \
Q_INTERFACES(nPanPlug) \
Q_PLUGIN_METADATA(IID "org.myapp.plug") \
public: \
__c_name##__appendix() {qRegisterMetaType<__c_name *>(#__c_name"*");} \
QByteArray name() {return #__c_name;} \
};
#define MY_PLUGIN(__c_name) MY_PLUGIN_BASE(__c_name,Plug)
所以在我的代码中(定义 qwerty
的地方)我只需要添加:
MY_PLUGIN(qwerty)
这将展开(g++ -E
的输出):
class qwertyPlug : public QObject, myPlug { Q_OBJECT Q_INTERFACES(nPanPlug) Q_PLUGIN_METADATA(IID "org.myapp.plug") public: qwertyPlug() {qRegisterMetaType<qwerty *>("qwerty""*");} QByteArray name() {return "qwerty";} };
它看起来还不错(对于可读性很抱歉,但我不知道如何添加换行符..)如果 copy/paste 我的代码中的上述行但是...
当我编译我的项目时,我从 moc
:
Error: Class declaration lacks Q_OBJECT macro.
有人有想法吗?
事实证明,正如@Silicomancer 所建议的那样,您不能按原样进行。
我发现问题出在多行宏上,如果宏是单行的,它确实有效:
#define MY_PLUGIN_BASE(__c_name,__appendix) class __c_name##__appendix : public QObject, myPlug { Q_OBJECT Q_INTERFACES(nPanPlug) Q_PLUGIN_METADATA(IID "org.myapp.plug") public: __c_name##__appendix() {qRegisterMetaType<__c_name *>(#__c_name"*");} QByteArray name() {return #__c_name;} };
对我来说,看起来 moc 遍历文件寻找 Q_OBJECT
但不会混淆宏