Vorrei scrivere una libreria C++ che è non-header-only per impostazione predefinita, ma potrebbe essere utilizzata come libreria di sola intestazione che definisce una macro NOLIB
.Libreria solo intestazioni opzionale
ho visto due approcci:
- definizioni in linea
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() { ... }
- modello "artificiale"
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() { ... }
Quali sono i pro e i contro di questi approcci? Ci sono opzioni migliori?
Se le funzioni sono abbastanza piccole da essere allineate, è possibile spedire le implementazioni in una libreria statica o persino spedire i file .cc. –