可选的标头库

man*_*lio 6 c++ organization header-files libraries 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
Run Code Online (Sandbox Code Playgroud)

foo.cc

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

MYINLINE void foo::something() { ... }
Run Code Online (Sandbox Code Playgroud)
  • "人工"模板

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
Run Code Online (Sandbox Code Playgroud)

foo.cc

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

MYTEMPLATE
void MYFOO_T::something() { ... }
Run Code Online (Sandbox Code Playgroud)

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

小智 2

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