【问题标题】:Should I use #ifndef Q_MOC_RUN as much a possible?我应该尽可能使用#ifndef Q_MOC_RUN 吗?
【发布时间】:2020-03-24 18:31:03
【问题描述】:

我有一个使用 Boost 库的 Qt/C++ 项目,我看到 Boost 标头是这样包含的:

#ifndef Q_MOC_RUN
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
#endif

我了解到,如果您不这样做,MOC 可能会导致问题。

问题是,我不应该使用这个保护来包含所有其他绝对不包含 Q_OBJECT marco 的标题吗?例如标准库头文件和其他非 Qt 库? MOC预处理器运行时不是会节省很多时间吗?

【问题讨论】:

  • 我会说:只有在必要时才这样做。如果“moc 引起问题”,编译器通常会告诉你。
  • @FrankOsterfeld,感谢您的回复!为什么不一直这样做以节省构建时间?

标签: c++ qt boost include moc


【解决方案1】:

来自话题Qt5 moc error in combination with boost

首先,这是一个已知的 MOC 问题。 MOC 无法扩展某些 Boost 库中使用的宏。 我相信 Qt 4.8 工作的原因是 特定 Boost 宏定义的解决方法已添加到 该版本的 MOC 配置。

解决此问题需要采取的措施:如上所述,使用 Q_MOC_RUN 注释掉有问题的标题。 您只需要使用 Q_MOC_RUN 在产生 moc 文件的文件中(例如 myheader.h 将 产生 moc_myheader.cpp)。您可以将黑客限制在这些文件中。 所以你不需要#ifndef Boost headers 的所有用法 项目限制了实施此解决方案的痛苦 位。

看来这个问题很久以前就解决了,所以不管你没有任何问题,也不需要支持旧版本的 Qt,你可能不会在以后的代码中添加这个宏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 2011-07-03
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多