【问题标题】:Yet another header circular dependency又一个头文件循环依赖
【发布时间】:2014-01-14 23:04:43
【问题描述】:

我知道这个网站上有很多关于循环依赖的答案,但我发现没有一个可以解决我的问题,主要是因为我的定义被内联在标题中。

我正在用 C++11 编写一个库。为简单起见,我有两个类:

  • ExceptionException.hpp
  • CallStack in CallStack.hpp

依赖项是:

  • Exception 大量使用CallStack(在声明和定义中都需要CallStack完整类型)所以Exception.hpp 包含CallStack.hpp
  • CallStack 在它的声明中根本不需要 Exception。它只需要在其中一个成员定义(operator[])中抛出一个Exception(调用非默认的Exception 构造函数),因此它需要一个完整类型的Exception 在定义中。

我知道如果我将定义写在.cpp 文件中,我会解决问题,但是由于所有方法和构造函数的行数都不超过 2 行,因此我选择将它们定义为内联,这意味着它们需要在.hpp header 中定义。

在声明之前有一个前向声明并在声明和定义之间包含另一个标题的解决方案不起作用,正如我已经说过的,Exception 在其声明中需要一个完整的CallStack 类型.

【问题讨论】:

  • 你想通过内联方法来获得什么优势?表现?避免创建和额外的文件?还有什么?
  • @DaleWilson 性能,因为方法只有 1 或 2 行长。我确实有具有更长方法的.cpp 文件。
  • 不管怎样,性能影响几乎肯定不值得担心,而且,一个好的优化编译器最终可能会内联函数(参见:stackoverflow.com/questions/1626248/…)。
  • 性能很关键吗?您是否已经分析了您的代码并确定内联这些方法可以为您带来显着的改进?如果两个答案都是肯定的,那么你可以做一些丑陋的事情来完成这项工作。但是,如果您不能用响亮的“是”回答这两个问题,那么@Reed 是对的,请将实现放在 cpp 文件中。 (并继续进行更有趣的挑战。)
  • @bolov:啊,但是如果您打开正确的优化,链接器可以。 (请参阅整体程序优化或类似选项。)

标签: c++ c++11 header-files circular-dependency


【解决方案1】:

我知道如果我在 .cpp 文件中编写定义,我可以解决问题,但是由于所有方法和构造函数的行数都不超过 2 行,因此我选择将它们定义为内联,这意味着它们需要在 .hpp 头文件中定义。

在 .cpp 文件中编写定义确实是正确的解决方案。您需要在CallStack 中转发声明Exception 类型,并将使用Exception 的函数的实现细节移动到.cpp 文件中。

【讨论】:

    【解决方案2】:

    为声明 (foo-declarations.hpp) 和内联 (foo-inlines.hpp) 创建单独的标头,并按顺序包含:

    #include "Callstack-declarations.hpp"
    #include "Exception-declarations.hpp"
    #include "Callstack-inlines.hpp"
    #include "Exception-inlines.hpp"
    

    如果您不想到处重复四行,请将这四行粘贴在另一个标题 "Callstack+Exception.hpp" 中。或者为了最小化包含:

    // Exception.hpp
    #include "Callstack-declarations.hpp"
    #include "Exception-declarations.hpp"
    #include "Exception-inlines.hpp"
    
    // Callstack.hpp
    #include "Callstack-declarations.hpp"
    #include "Exception-declarations.hpp"
    #include "Callstack-inlines.hpp"
    

    【讨论】:

    • 这是一个非常有趣的解决方案,但是,我不喜欢我必须创建那么多标题。我选择将定义放在.cpp 文件中。
    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2011-06-16
    • 2015-07-25
    • 1970-01-01
    相关资源
    最近更新 更多