Я хотел бы написать библиотеку 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() { ... }
Каковы плюсы и минусы этих подходов? Есть ли лучшие варианты?
В каждом подходе нет реальной разницы, потому что как встроенные методы, так и шаблоны могут в конечном итоге вставляться в ваш код в зависимости от оптимизации компилятора. Увидеть этот пост, обсуждающий встроенные против шаблонов.