为什么在Qt源代码文件末尾包含".moc"文件很重要?

Dan*_*tos 9 c++ qt introspection moc

为什么在Qt cpp源代码中添加.moc文件的包含很重要?

这是几个Qt样本中常用的步骤,包括这个:http: //doc.qt.io/qt-5/qttestlib-tutorial1-example.html ; #include"testqstring.moc"行应该包含在文件的末尾.

我不明白为什么这是必要的.

谢谢.

pep*_*ppe 23

如果您在文件中QObject使用Q_OBJECT宏定义子类,则必须这样做.cpp.当你这样做时:

  1. qmake必须在您的内部生成规则Makefile以调用moc.cpp文件.

    那个特殊的(hackish?)包含会触发qmake这样做,并在你的调用时告诉它哪个是moc输出文件(teststring.moc).cpp.

  2. 为了编译moc输出(仍然是一堆C++代码),编译器必须看到你的类定义.否则,它会抱怨没有类似的东西YourClass::staticMetaObject,因为它不知道YourClass存在.

    通常,一个定义Q_OBJECT头文件中的类.moc然后#include "header.h"在其生成的输出中添加一个,这意味着moc可以愉快地编译输出.

    但是如果你的类定义在一个内部.cpp呢?你不能#include一个.cpp文件moc的输出,因为这将让你重新定义吨的错误.

    相反,你#include moc在你的输出.cpp,所以它被编译在一起,每个人都很高兴.(这意味着qmake只会发出一条规则要运行moc,而不是另一条规则告诉编译器编译moc输出.)

从2.你也可以假设Q_OBJECT在a .h中定义类不需要任何特殊的包含.

  • 正如我所说,有一个类定义,在cpp中有一个`Q_OBJECT`. (4认同)