Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ #define宏中的无参数函数导致错误,尽管gcc-E输出正确_C++_Qt_Gcc_Clang_C Preprocessor - Fatal编程技术网

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

C++ #define宏中的无参数函数导致错误,尽管gcc-E输出正确,c++,qt,gcc,clang,c-preprocessor,C++,Qt,Gcc,Clang,C Preprocessor,我有一个对象来存储系统范围内的颜色属性,该属性包含大量重复代码,例如: Q_PROPERTY( QColor backgroundColor MEMBER m_backgroundColor NOTIFY backgroundColorChanged ) #define COLOR(name) public: Q_PROPERTY( QColor name MEMBER m_##name NOTIFY name##Changed ) signals: void name##Changed();

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

Q_PROPERTY( QColor backgroundColor MEMBER m_backgroundColor NOTIFY backgroundColorChanged )
#define COLOR(name) public: Q_PROPERTY( QColor name MEMBER m_##name NOTIFY name##Changed ) signals: void name##Changed(); private: QColor m_##name;
其次是:

QColor m_backgroundColor;
signals: void backgroundColorChanged();
我现在有数百个这样的宏,而且对象很难读取和修改,因此我想用宏替换上面的宏,例如:

Q_PROPERTY( QColor backgroundColor MEMBER m_backgroundColor NOTIFY 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;
但是当我尝试构建项目时,它给了我以下错误:错误:通知信号'backgroundColorChanged'属性'backgroundColor'在类Colors中不存在

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


为什么正确扩展的宏无法生成这样的宏?我如何修复它?

恐怕没有解决此问题的方法

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


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

您的问题是颜色会扩展到宏中,但宏不会扩展,预处理器会继续。因此,您基本上是需要另一次预处理器的代码,但是如果我删除
信号:void name##Changed()从它编译并运行的颜色宏,尽管没有更改信号。它似乎是
()导致问题。请注意,错误是由
moc
给出的,而不是由GCC给出的。可能是缺陷/限制?谢谢,这似乎就是问题所在。手动定义信号是可行的,这是一个不错的解决办法。