尽管gcc -E输出正确,但#define宏中的无参数函数会导致错误

时间:2015-05-30 10:46:43

标签: c++ qt gcc clang c-preprocessor

我有一个对象来存储系统范围的颜色属性,这些属性具有大量的重复代码,例如:

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;

但是当我尝试构建项目时,它会给我以下错误:错误:NOTIFY signal' backgroundColorChanged'财产' backgroundColor'类Color中不存在。

但是,如果我手动复制gcc -E的输出并将其粘贴到头文件中,则编译并运行时没有问题。

为什么正确扩展的宏无法像这样构建,我该如何解决?

1 个答案:

答案 0 :(得分:1)

我担心这个问题没有解决办法。

Moc解析信号和属性的C ++标头。它不会扩展任何宏,因此它看不到您的信号。您可以看到生成此错误的代码here,并且无法禁用或欺骗此检查。

理想情况下,这应该在moc中修复(它应该提供绕过此检查的选项,或者能够像编译器那样扩展宏)。您可以使用另一个预处理器将宏扩展到另一个文件,然后将标头传递给moc(如果您使用cmake,这是完全可能的,但我不确定qmake),但我认为这有点过分。我建议你从宏中删除信号声明并明确定义信号。