【问题标题】:Forward declare or #include first?先转发声明还是#include?
【发布时间】:2015-04-13 13:36:39
【问题描述】:

今天,一位同事询问是否有技术原因#include headers,然后再在 header 中声明一个类。具体来说,我对#includes 本身的顺序或forward declare#includes 的优点不感兴趣,但出于任何技术原因,一个顺序优于另一个顺序。

示例:假设 companions.h 是正确的,因为它要求 donna.hclara.h#includeCSpaceTimeContinuumCTardis 可以被前向声明。 #include 然后转发声明会更好吗?

// companions.h
#include "donna.h"
#include "clara.h"
class CSpaceTimeContinuum;
class CTardis;

或者转发声明然后#include?​​p>

// companions.h
class CSpaceTimeContinuum;
class CTardis;
#include "donna.h"
#include "clara.h"

如果没有技术差异并且只是风格上的差异,我也很乐意了解这一点。谢谢!

【问题讨论】:

  • 这里不是一个强有力的论点,更多的是一种习惯:包含对我来说是最重要的,所以文件的实际“手写”内容总是在它们下面。我不会自发寻找#include <iostream> 以上的代码。但这可能只是我。
  • 等等...这个问题只是关于订购不相关的#includes 和前向声明吗? CTardis这里与donna.hclara.h无关?

标签: c++ header-files forward-declaration


【解决方案1】:

总是先标头,然后前向声明。否则,您将面临不必要的依赖风险,例如,每当您包含 donna.h 时,您都需要重复前向声明(因为您无意中引入了对它的需求)。

【讨论】:

  • 你能添加一个你所描述的例子吗?
  • 我在这里有一个类似问题的答案:stackoverflow.com/a/3935468/286406。在那里,我尝试描述使用前向声明、公共和私有头文件以及 .cpp 文件本身来构造我的代码的方式。希望这会有所帮助!
【解决方案2】:

"donna.h""clara.h" 应该被构造成不依赖于外部前向声明,这使得在任何这些文件中声明的 CSpaceTimeContinuumCTardis 之间可能存在冲突的实际可能性和您在本地源中对这些类的使用。唯一的区别在于行的顺序可能产生的碰撞情况的诊断。

【讨论】:

    猜你喜欢
    • 2010-09-23
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多