C++ Qt4中宏的继承

C++ Qt4中宏的继承,c++,macros,qt4,C++,Macros,Qt4,我的部分代码如下所示 #include <QObject> #define MYMACRO : public QObject #define SIGNAL_MACRO Q_OBJECT signals: void testSignal(std::string s); #define EMIT_MACRO emit testsignal(s); class myclass MYMACRO { SIGNAL_MACRO ... void myclass::method() {

我的部分代码如下所示

#include <QObject>
#define MYMACRO : public QObject
#define SIGNAL_MACRO Q_OBJECT signals: void testSignal(std::string s);
#define EMIT_MACRO emit testsignal(s);

class myclass MYMACRO
{
   SIGNAL_MACRO
...

void myclass::method()
{
   std::string s("string");
   EMIT_MACRO
}
#包括
#定义MYMACRO:公共QObject
#定义信号\宏Q \对象信号:void testSignal(std::string s);
#定义发射\宏发射测试信号;
类myclass MYMACRO
{
信号宏
...
void myclass::method()
{
std::字符串s(“字符串”);
发射宏
}

如果我将宏的内容写入应该展开的位置,它就可以正常工作。但是如果我保留宏并让预处理器完成工作,那么我会得到一个“对myclass::testSignal(std::string)的未定义引用”“。我不明白有什么区别。预处理器应该像第一次遇到宏一样展开宏,就像我自己写出来一样。我想我可以在宏中写任何东西,它只需复制粘贴到需要的地方。

你确定当你手动“写宏的内容”时,你可以重新编写与宏扩展产生的代码完全相同的代码

在我看来,SIGNAL_宏声明了
testSignal()
函数,但没有定义它,即函数没有主体,这肯定会导致您看到的错误


但是,很难从您的代码中分辨出来,因为宏的使用会使事情变得混乱。我建议您不要以这种方式使用宏,因为这样会使代码很难阅读和理解。

您确定当您手动“编写宏的内容”时,您编写的代码与宏的扩展会产生什么

在我看来,SIGNAL_宏声明了
testSignal()
函数,但没有定义它,即函数没有主体,这肯定会导致您看到的错误


但是,从代码中很难判断,因为宏的使用会使事情变得混乱。我会建议你不要用宏来这样做,因为它使得代码很难阅读和理解。

< P>我认为这里的问题可能是Qt元对象编译器在C++预处理器之前运行,所以它不能到达。查看
SIGNAL\u宏
中的
Q\u对象

MOC工具读取C++头文件。如果它找到一个或多个类 包含QHObjor宏的声明,它产生C++源 包含这些类的元对象代码的文件


我的建议是,不要这样做。

< P>我认为这里的问题可能是Qt元对象编译器在C++预处理器之前运行,因此在SaleAlxGe宏中不能看到<代码> QyObjult<代码>。

MOC工具读取C++头文件。如果它找到一个或多个类 包含QHObjor宏的声明,它产生C++源 包含这些类的元对象代码的文件


我的建议是,不要这样做。

我不想粗鲁,但你想让你的代码变得难以阅读吗?我不想粗鲁,但你想让你的代码变得难以阅读吗?首先,如果这很难阅读,我很抱歉。我试图创建一个简单的示例来说明我的问题。其次,谢谢。我没有想到这样的事实qmake首先运行。第三,我理解这看起来非常难看,但实际上我有一个合理的理由。但无论如何,我会尝试其他方法。首先,如果这很难理解,我很抱歉。我试图创建一个简单的示例来说明我的问题。第二,谢谢。我没有想到qmake首先运行的事实。第三,我我认为这看起来非常难看,但实际上我有一个合理的理由。但无论如何,我会尝试其他方法。在Qt中,信号体没有定义,所以不会导致问题。但这没关系,因为TonyK已经回答了我的问题。在Qt中,信号体没有定义,所以不会导致问题。Bu没关系,因为TonyK已经回答了我的问题。