【发布时间】:2015-05-30 10:46:43
【问题描述】:
我有一个对象来存储系统范围的颜色属性,其中包含大量重复代码,例如:
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'的通知信号'backgroundColorChanged'在类Colors中不存在。
但是,如果我手动复制 gcc -E 的输出并将其粘贴到头文件中,它将编译并运行没有问题。
为什么正确扩展的宏无法像这样构建,我该如何解决?
【问题讨论】:
-
您的问题是 COLOR 扩展为宏,但该宏没有扩展,预处理器继续运行。所以你所拥有的基本上是需要再通过一次预处理器的代码
-
但是,如果我从 COLOR 宏中删除
signals: void name##Changed();,它会编译并运行,尽管没有更改信号。这似乎是导致问题的();。 -
请注意,错误是由
moc给出的,而不是由 GCC 给出的。也许是错误/限制?
标签: c++ qt gcc clang c-preprocessor