是否有这样的依赖模式,以至于不可能仅将所有内容保留在标题文件中?如果我们仅执行每个标题一个类别的规则怎么办?

出于这个问题的目的,让我们忽略静态事物:)

有帮助吗?

解决方案

我知道标准C ++没有功能,除了您已经提到的静态功能,这些静态需要库来定义完整的翻译单元(而不是仅标题)。但是,不建议这样做,因为当您这样做时,您会强迫所有客户在库更改时重新编译整个代码库。如果您使用的是源文件或静态库或动态库形式的分发形式,则可以更改/更新/修改您的库,而无需强迫所有人重新编译。

其他提示

我想说的是,在不使用许多语言功能的明确条件下:正如您所注意到的,有几种用途 static 关键词。

它可能需要一些技巧,但可以对其进行审查。

  1. 每当需要打破依赖周期时,即使两个文件在实践中将是标题文件,您都需要保持标题 /源区别。
  2. 自由函数(非模板)必须在线声明,编译器可能不会内联,但是如果它们被声明,这样就不会抱怨客户在客户端构建其库 /可执行文件时已重新定义它们。
  3. 全球共享的数据(全局变量和类静态属性)应使用函数 /类方法中的局部静态属性进行模拟。实际上,就呼叫者而言,它几乎无关紧要(只是补充 ())。请注意,在C ++ 0x中,这成为受欢迎的方式,因为它保证在仍在保护初始化命令惨败的同时是线程安全的,直到那时...它不是线程安全;)

尊重这3分,我相信您将能够编写一个纯粹的标题图书馆(有人看到我错过的其他东西吗?)

许多Boost库也使用类似的技巧仅是标题,即使它们的代码不是完全模板。例如 Asio 非常有意识地做,并使用标志提出了替代方案(请参阅 ASIO 1.4.6的发行说明):

  • 只需要几个功能的客户不必担心构建 /链接,他们只是抓住所需的东西
  • 提供更多依赖它或想减少汇编时间的客户能够构建自己的ASIO库(带有自己的标志),然后包括“轻量级”标头

这样(按照图书馆开发的更多努力的代价)客户也得到了蛋糕并食用。我认为这是一个非常不错的解决方案。

笔记: 我想知道是否 static 函数可以被夹住,我更喜欢自己使用匿名名称空间,因此永远不会真正研究它...

每个标题规则的一个类是毫无意义的。如果这不起作用:

#include <header1>
#include <header2>

然后,这将有一些变化:

#include <header1a>
#include <header2>
#include <header1b>

这可能会导致每个标头少于一个类,但是您可以始终使用(void*),以及铸造和内联函数(在这种情况下,编译器可能会适当忽略“内联”)。因此,在我看来,问题可以简化为:

class A
{
// ...
void *pimpl;
}

私人实施PIMPL是否可能取决于A的声明?如果是这样,则PIMPL.CPP(作为标头)必须既有先进又关注AH,但是由于您可以始终再次使用(void*),并在前面的标题中使用(void*)和铸造和内联功能,因此可以完成。

当然,我可能错了。无论哪种情况:iCk。

在我的漫长职业生涯中,我没有遇到依赖模式,而不会允许仅限标头实施。

请注意,如果类之间有循环依赖关系,则可能需要诉诸抽象接口 - 具体实现范式或使用模板(使用模板允许您转发引用属性/模板参数的方法,这些属性在稍后在Istantiatiation期间解析)。

这并不意味着您应该始终瞄准仅标题库。尽管如此,它们应该保留到模板和内联代码。他们不应包括实质性的复杂计算。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top