我什么时候必须在 Qt 中包含 moc*.cpp?
When do I have to include moc*.cpp in Qt?
我明白为什么最好手动包含 moc*.cpp
而不是让 moc 自己做的基本概念,但我不太明白 when我必须包括它。
假设我有 mainwindow.cpp
和 mainwindow.hpp
,它们需要 moc 运行。在这里,我知道我必须在 mainwindow.cpp
中包含 moc_mainwindow.cpp
(而不是在 mainwindow.hpp
中)。
但是如果我有包含 mainwindow.hpp
的 foo.cpp
,我是否必须在 foo.cpp
中包含 moc_mainwindow.hpp
?我只是不清楚整个 moc 是如何工作的,所以有人可以解释一下吗? (而且,是的,我确实在互联网上对此进行了研究 - 我阅读了关于 moc 的 Qt 文档,但它并没有让我清楚)。
moc 文件包含元对象的实现、信号槽糖和其他一些东西。这意味着如果你多次编译它,你将在链接阶段有重复的符号。
实际上你最好的选择是不包含 moc'ed 文件并将其添加为项目的其他正常编译单元。它简化了您的代码,防止了链接错误,并且在修改实现文件时对您的编译时间有很好的影响。
然而,如果您决定手动包含 moc 文件,则必须只在一个地方执行,以防止上述重复实现。
另一种直接包含对表现力有用的情况是当您在 .cpp 文件中用 Q_OBJECT
声明 class 时:在同一文件中包含 moc'ed 与这样的 class 只属于那个文件的事实。
我明白为什么最好手动包含 moc*.cpp
而不是让 moc 自己做的基本概念,但我不太明白 when我必须包括它。
假设我有 mainwindow.cpp
和 mainwindow.hpp
,它们需要 moc 运行。在这里,我知道我必须在 mainwindow.cpp
中包含 moc_mainwindow.cpp
(而不是在 mainwindow.hpp
中)。
但是如果我有包含 mainwindow.hpp
的 foo.cpp
,我是否必须在 foo.cpp
中包含 moc_mainwindow.hpp
?我只是不清楚整个 moc 是如何工作的,所以有人可以解释一下吗? (而且,是的,我确实在互联网上对此进行了研究 - 我阅读了关于 moc 的 Qt 文档,但它并没有让我清楚)。
moc 文件包含元对象的实现、信号槽糖和其他一些东西。这意味着如果你多次编译它,你将在链接阶段有重复的符号。
实际上你最好的选择是不包含 moc'ed 文件并将其添加为项目的其他正常编译单元。它简化了您的代码,防止了链接错误,并且在修改实现文件时对您的编译时间有很好的影响。
然而,如果您决定手动包含 moc 文件,则必须只在一个地方执行,以防止上述重复实现。
另一种直接包含对表现力有用的情况是当您在 .cpp 文件中用 Q_OBJECT
声明 class 时:在同一文件中包含 moc'ed 与这样的 class 只属于那个文件的事实。