我什么时候必须在 Qt 中包含 moc*.cpp?

问题描述

我理解为什么最好手动包含 moc*.cpp 而不是让 moc 自己做的基本概念,但我不太明白什么时候我必须包含它.

假设我有 mainwindow.cppmainwindow.hpp,需要在它们上运行 moc。在这里,我知道我必须在 moc_mainwindow.cpp 中包含 mainwindow.cpp(而不是在 mainwindow.hpp 中)。

但是如果我有包含 foo.cppmainwindow.hpp,我是否必须在 moc_mainwindow.hpp 中包含 foo.cpp?我不清楚整个模拟过程是如何工作的,所以有人可以解释一下吗? (而且,是的,我确实在互联网上对此进行了研究 - 我阅读了有关 moc 的 Qt 文档,但我没有说清楚。

解决方法

moc'ed 文件包含元对象的实现、信号槽糖和其他一些东西。这意味着如果您多次编译它,您将在链接阶段出现重复的符号。

实际上,您最好的选择是不包含 moc 文件并将其添加为项目的其他正常编译单元。它可以简化您的代码,防止链接错误,并在修改实现文件时对您的编译时间产生良好影响。

尽管如此,如果您决定手动包含 moc 文件,您必须只在一个地方进行,以防止上述重复实现。

另一种直接包含有助于表达的情况是,当您在 .cpp 文件中使用 Q_OBJECT 声明一个类时:在同一文件中包含 moc'ed 与此类属于的事实一致只到那个文件。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...