#define 宏中的无参数函数导致错误,尽管 gcc -E 输出正确
Parameterless function in #define macro causes error despite gcc -E output being correct
我有一个对象来存储系统范围的颜色属性,其中有大量重复代码,例如:
Q_PROPERTY( QColor backgroundColor MEMBER m_backgroundColor NOTIFY backgroundColorChanged )
其次是:
QColor m_backgroundColor;
signals: void backgroundColorChanged();
我现在有几百个这样的,对象很难读取和修改所以想用宏来代替上面的,比如:
#define COLOR(name) public: Q_PROPERTY( QColor name MEMBER m_##name NOTIFY name##Changed ) signals: void name##Changed(); private: QColor m_##name;
其次是
COLOR(backgroundColor)
如果我对这个文件 运行 gcc -E 它给出了我期望的输出:
public: Q_PROPERTY( QColor backgroundColor MEMBER m_backgroundColor NOTIFY backgroundColorChanged ) signals: void backgroundColorChanged(); private: QColor m_backgroundColor;
但是当我尝试构建项目时,出现以下错误:错误:属性 'backgroundColor' 的 NOTIFY 信号 'backgroundColorChanged' 不存在于class 颜色。
但是,如果我手动复制 gcc -E 的输出并将其粘贴到它编译的头文件中,运行s 没有问题。
为什么正确展开的宏无法像这样构建,我该如何解决?
恐怕这个问题没有解决方案。
Moc 解析 C++ headers 的信号和属性。它不会扩展任何宏,因此看不到您的信号。您可以看到生成此错误的代码 here,并且无法禁用或欺骗此检查。
理想情况下,这应该在 moc 中修复(它应该提供绕过此检查的选项或具有像编译器那样扩展宏的能力)。在将 header 传递给 moc 之前,您可以使用另一个预处理器将宏扩展到另一个文件(如果您使用 cmake,这是完全可能的,但我不确定 qmake),但我认为这是矫枉过正。我建议您从宏中删除信号声明并明确定义信号。
我有一个对象来存储系统范围的颜色属性,其中有大量重复代码,例如:
Q_PROPERTY( QColor backgroundColor MEMBER m_backgroundColor NOTIFY backgroundColorChanged )
其次是:
QColor m_backgroundColor;
signals: void backgroundColorChanged();
我现在有几百个这样的,对象很难读取和修改所以想用宏来代替上面的,比如:
#define COLOR(name) public: Q_PROPERTY( QColor name MEMBER m_##name NOTIFY name##Changed ) signals: void name##Changed(); private: QColor m_##name;
其次是
COLOR(backgroundColor)
如果我对这个文件 运行 gcc -E 它给出了我期望的输出:
public: Q_PROPERTY( QColor backgroundColor MEMBER m_backgroundColor NOTIFY backgroundColorChanged ) signals: void backgroundColorChanged(); private: QColor m_backgroundColor;
但是当我尝试构建项目时,出现以下错误:错误:属性 'backgroundColor' 的 NOTIFY 信号 'backgroundColorChanged' 不存在于class 颜色。
但是,如果我手动复制 gcc -E 的输出并将其粘贴到它编译的头文件中,运行s 没有问题。
为什么正确展开的宏无法像这样构建,我该如何解决?
恐怕这个问题没有解决方案。
Moc 解析 C++ headers 的信号和属性。它不会扩展任何宏,因此看不到您的信号。您可以看到生成此错误的代码 here,并且无法禁用或欺骗此检查。
理想情况下,这应该在 moc 中修复(它应该提供绕过此检查的选项或具有像编译器那样扩展宏的能力)。在将 header 传递给 moc 之前,您可以使用另一个预处理器将宏扩展到另一个文件(如果您使用 cmake,这是完全可能的,但我不确定 qmake),但我认为这是矫枉过正。我建议您从宏中删除信号声明并明确定义信号。