包含Q_OBJECT的c ++宏

时间:2016-12-09 09:20:35

标签: c++ qt c-preprocessor moc

我正在开发一个有几个插件的c ++ / Qt程序。 对于每个类,我必须定义一个如下所示的插件接口:

web service

我创建了一个宏(实际上是2,因为我不是c ++预处理器大师):

//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";} 
};

这样在我的代码中(其中定义了#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";} };

中收到错误
moc

有人有想法吗?

1 个答案:

答案 0 :(得分:0)

事实证明,正如@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但不会弄乱宏