gpt4 book ai didi

c++ - 使用宏创建 Q_INVOKABLE 函数

转载 作者:搜寻专家 更新时间:2023-10-31 02:09:45 25 4
gpt4 key购买 nike

我正在尝试简化(即摆脱大量样板代码)在必须标记为“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' 之前需要不合格的 id void GENERATE_HANDLER_SIGNATURE(NAME);

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

有什么想法吗?

最佳答案

Q_INVOKABLE 由元对象编译器 (moc) 处理,它本身不会展开宏,而是在展开宏之前运行,因此它看不到您的宏。

关于c++ - 使用宏创建 Q_INVOKABLE 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46221543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com