C ++库API设计


12

我正在寻找一个很好的资源来学习C ++库的良好API设计,查看共享的对象/ dll等。在源代码级别上有很多资源可以编写漂亮的API,漂亮的类,模板等,但是几乎没有将它们放到共享的库和可执行文件中。约翰·拉科斯(John Lakos)的《大规模C ++软件设计》一书很有趣,但已经过时了。

我正在寻找的是关于处理模板的建议。在API中使用模板后,我通常会在可执行文件(或其他库)中获得库代码,因此,如果在那里修复错误,我将无法简单地推出新库,而必须重新编译和重新分发该代码的所有客户端。(是的,我知道一些解决方案,例如尝试实例化至少库中最常见的版本等)。

我还在寻找其他注意事项和在C ++库上保持二进制兼容性时需要注意的事项。

是否有一个很好的网站或关于此类事情的书?


我是这样处理的:sivut.koti.soon.fi/~terop/GameApi.html-即,虽然lib中有模板,但它们都不在api中
tp1 2012年

1
std::unique_ptr是相当新的东西。您认为什么适合您提出的API?例如,您必须手动管理所有资源的方式,实际上可以保证泄漏和重复删除?还是您的许多类型都有一个或两个字母名称,以致无法区分其目的?
DeadMG 2012年

1
@ tp1:但是您并没有注意到我确实处理了它们。您只是说了“ HANDLE THEM”,而没有做任何事情。我没有处理,现在呢?而不是使用不允许此类错误的RAII类。如果您曾经使用过unique_ptr,将无法编写这样的代码。
DeadMG 2012年

1
@ tp1:我注意到Env可以被破坏。就是这样。似乎根本没有任何功能可以管理对象。如果我想管理的内存比“我创建的所有东西”或“什么都没有”更细粒度,那么看来我很费劲。
DeadMG 2012年

3
请与软件工程聊天室进行更多交谈。问题或答案中可以包含任何有用的信息吗?
克里斯·

Answers:



3

这几乎是不可能的。一个简单的事实是,有时候,您需要编译器来完成一项工作,而不能仅仅魔术般地消除了这种必要性。没有任何函数不能使std::vector仅标头库成为可能。编译器可以使许多魔术发挥作用,但是如果不调用它就无法拥有它们,这是不争的事实。

您可以执行以下操作:不要在不需要模板的地方使用模板。这是您无法做的:其他任何事情。

一个简单的事实是,与可以使用静态类型的库获得的性能,安全性和功能优势相比,使用新版本进行重新编译实际上并没有太大的负担。


2
我提到了作为示例考虑的例子。我正在寻找的是有关我应该准备的其他类似问题的指南,以及应对这些问题的最佳做法。
johannes 2012年

好吧,如果所有破坏ABI兼容性的新版本都放入一个新的行内命名空间,那么它是否是仅标头的库又有什么关系呢?
Deduplicator
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.