7

我想编写一个 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() { ... }

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

4

1 回答 1

2

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

于 2014-04-25T02:41:08.653 回答