我正在尝试简化(即摆脱大量的样板代码)在类中创建必须标记为“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
产生此错误:
#define HANDLER_PREFIX handler_
我还尝试将Q_INVOKABLE
直接包含在MACRO GENERATE_HANDLERS
中,这会导致代码编译但函数未被导出。
有什么想法吗?
答案 0 :(得分:2)
Q_INVOKABLE由Meta-Object Compiler(moc)处理,它不会扩展宏本身并在扩展宏之前运行,所以它不会看到你的宏。