为什么在Qt cpp源代码中为.moc文件添加一个include很重要?

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

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

谢谢。

最佳答案

如果在QObject文件中使用Q_OBJECT宏定义.cpp子类,则很有必要。 这样做时:

  • qmake必须在Makefile内部生成规则,以在该moc文件上调用.cpp

    这种特殊的(hackish?)包含会触发qmake这样做,并告诉它在moc上调用时将是teststring.moc的输出文件(.cpp)。
  • 为了编译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中使用.h定义类不需要任何特殊的包含。

    07-24 09:45
    查看更多