Optional Header Only Library

I would like to write a C ++ library, which by default is not a header, but can be used as a header-only library that defines the NOLIB macro.

I saw two approaches:

  • inline definitions

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() { ... } 

  • Artificial Pattern

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() { ... } 

What are the pros and cons of these approaches? Are there any better options?

+6
source share
1 answer

There is no real difference in each approach, because both built-in methods and templates can be inserted in a row with your code, depending on the optimization of the compiler. See this after discussing inline templates.

+2
source

All Articles