我应该何时考虑仅限图书馆标题?

Bil*_*eal 25 c++ header-only

显然模板库只需要标题,但对于非模板,什么时候应该只使用标题?

Ste*_*sop 14

如果您认为非模板库可能只是标题库,请考虑将其分为两个文件,然后提供包含.h.cpp(包含保护)的第三个文件.

然后,任何在很多不同的TU中使用你的库,并怀疑这可能花费大量编译时间的人都可以轻松地进行更改以测试它.

一旦您知道用户可以选择使用库的方式,答案可能会变成"随时提供该选项".因此,几乎任何时候从多个TU中包含它都不会违反ODR.例如,如果你的非static自由函数引用static全局变量,那么你就不走运了,因为不同TU中该函数的不同定义会引用同名的不同对象,这是一种ODR违规.

  • @Billy,@ DeadMG:对不起,比利是对的,当我写评论时,我和DeadMG的想法完全一样,但当然它只适用于仅限标题的情况.你需要一个"THE_RIGHT_LINKAGE_DAMMIT"宏. (3认同)
  • 哦.从来没有想过这样做.+1当`.cpp`是`#include`d时,如何正确地将函数声明设置为`inline`? (2认同)
  • @Billy:在第三个文件中设置`#define`(第二个.h),在.cpp中有一个`#ifdef _____ #define DO_INLINE inline #else #define DO_INLINE #endif`. (2认同)