可选的标头库

时间:2014-04-24 13:01:59

标签: c++ header-files libraries organization header-only

我想编写一个默认情况下 not-header-only 的C ++库,但可以用作定义NOLIB宏的头文件库。

我看过两种方法:

  • 内联定义

foo.h中

#if !defined(FOO_H)
#define      FOO_H

#if defined(NOLIB)
#  define MYINLINE inline
#else 
#  define MYINLINE 
#endif

class foo
{
  // ...
};

#if defined(NOLIB)
#  include "foo.cc"
#endif

#endif  // include guard

foo.cc

#if !defined(NOLIB)
#  include "foo.h"
#endif

MYINLINE void foo::something() { ... }

  • "人工"模板

foo.h中

#if !defined(FOO_H)
#define      FOO_H

#if defined(NOLIB)
#  define MYTEMPLATE template<bool DUMMY>
#  define MYFOO      foo_impl
#  define MYFOO_T    foo_impl<DUMMY>
#else
#  define MYTEMPLATE
#  define MYFOO      foo
#  define MYFOO_T    foo
#endif

MYTEMPLATE
class MYFOO
{
  // ...
};

#if defined(NOLIB)
   using foo = foo_impl<true>;
#  include "foo.cc"
#endif

#endif  // include guard

foo.cc

#if !defined(NOLIB)
#  include "foo.h"
#endif

MYTEMPLATE
void MYFOO_T::something() { ... }

这些方法的优点和缺点是什么?有更好的选择吗?

1 个答案:

答案 0 :(得分:2)

每种方法都没有真正的区别,因为内联方法或模板最终可能会根据编译器优化与代码内联插入。请参阅this讨论内联与模板的内容。