使用宏来创建Q_INVOKABLE函数

时间:2017-09-14 14:18:17

标签: c++ qt qt4

我正在尝试简化(即摆脱大量的样板代码)在类中创建必须标记为“INVOKABLE”的函数。

(非常像其他问题other question

从小处开始,我只是尝试使用一个函数:

#define CONCAT_NOEXPAND(A, B) A ## B
#define CONCAT(A, B) CONCAT_NOEXPAND(A, B)

#define HANDLER_PREFIX handler_
#define HANDLER_SIGNATURE (QString action, QString parameters)

#define GENERATE_HANDLER_SIGNATURE(ACTION) CONCAT(HANDLER_PREFIX, ACTION) HANDLER_SIGNATURE

#define GENERATE_HANDLERS(NAME) void GENERATE_HANDLER_SIGNATURE(NAME);

class Test : public QObject
{
    Q_OBJECT

public:
    explicit Test(QObject *parent = nullptr);

private:

    Q_INVOKABLE void handler_Test1 (QString, QString);  // Ok
    Q_INVOKABLE GENERATE_HANDLERS(Test2)  // Error!!
}

使用MACRO GENERATE_HANDLERS产生此错误:

  • 错误:粘贴“handler_”和“(”未提供有效的预处理令牌#define HANDLER_PREFIX handler_
  • 错误:'void'之前的预期unqualified-id  void GENERATE_HANDLER_SIGNATURE(NAME);

我还尝试将Q_INVOKABLE直接包含在MACRO GENERATE_HANDLERS中,这会导致代码编译但函数未被导出。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

Q_INVOKABLE由Meta-Object Compiler(moc)处理,它不会扩展宏本身并在扩展宏之前运行,所以它不会看到你的宏。