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:
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() { ... }
What are the pros and cons of these approaches? Are there any better options?
source share