Ich würde gerne eine C++ - Bibliothek schreiben, die nicht-Header-only standardmäßig ist, aber könnte als eine Header-Bibliothek verwendet werden, die eine NOLIB
Makro definieren.Optionale Header nur Bibliothek
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
0123:ich zwei Ansätze gesehen haben
#if !defined(NOLIB)
# include "foo.h"
#endif
MYINLINE void foo::something() { ... }
- "Artificial" template
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() { ... }
Was sind die Vor- und Nachteile dieser Ansätze? Gibt es bessere Möglichkeiten?
Wenn die Funktionen klein genug sind, um inline zu sein, können Sie die Implementierungen möglicherweise in einer statischen Bibliothek bereitstellen oder sogar die .cc-Dateien versenden. –