Незадължителна библиотека само за заглавки

Бих искал да напиша 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() { ... }

Какви са плюсовете и минусите на тези подходи? Има ли по-добри варианти?


person manlio    schedule 24.04.2014    source източник
comment
Ако функциите са достатъчно малки, за да бъдат вградени, потенциално бихте могли да изпратите реализациите в статична библиотека или дори да изпратите .cc файловете.   -  person R Sahu    schedule 24.04.2014


Отговори (1)


Няма реална разлика във всеки подход, тъй като и двата вградени метода или шаблони могат да се окажат вмъкнати в линия с вашия код в зависимост от оптимизациите на компилатора. Вижте тази публикация, обсъждаща вградени спрямо шаблони.

person bossbarber    schedule 25.04.2014
comment
Не се притеснявам много от раздуването на кода, тъй като една от причините е, че версията само със заглавка ще бъде за обикновен потребител. Мислех си за проблеми като кръгова зависимост или други непредвидени проблеми, които могат да възникнат при опит за конвертиране на стандартна библиотека. Също така изкуственият шаблон изглежда като участък от езика C++. - person manlio; 26.04.2014
comment
Мисля, че основното нещо, за което трябва да следите и в двата случая, е да избягвате използването на ред за пространство от имена във вашия код, което може да причини проблеми на крайния потребител, така че трябва да внедрите всичко в пространството от имена (ако ги съдите). Може да имате кръгови зависимости във всеки от случаите, които споменахте. - person bossbarber; 28.04.2014