- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
/*
* The use of singletons for globals makes globals not
* actually be initialized until it is first needed, this
* makes the library faster to load, and have a smaller
* memory footprint
*/
#define json_global_decl(TYPE, NAME, VALUE) \
class jsonSingleton ## NAME { \
public: \
inline static TYPE & getValue() json_nothrow { \
static jsonSingleton ## NAME single; \
return single.val; \
} \
protected: \
inline jsonSingleton ## NAME() json_nothrow : val(VALUE) {} \
TYPE val; \
}
#define json_global(NAME) jsonSingleton ## NAME::getValue() \
json_global_decl(json_string, CONST_TRUE, JSON_TEXT("true"));
json_global_decl(json_string, CONST_FALSE, JSON_TEXT("false"));
json_global_decl(json_string, CONST_NULL, JSON_TEXT("null"));
/* Использование */
json_global(ERROR_NULL_IN_CHILDREN)
Надоело писать зеленым цветом.
собственно любой метод, имеющий тело прямо внутри класса - уже inline, независимо от того, статический он или нет
просто некоторые старые компиляторы в этом не уверены (да, Тарас?)
Да это я знаю, на крестах недавно говнявкать потихоньку начал.
Мне не ясно, как сочетается объявление статического члена, который должен быть синглетоном (майерсовким), с inline-методом, который будет встраиваться во все места, где используется.
inline означает inline linkage - все инлайновые методы попадают в отдельное место в объектном модуле, и т.к. модулей при линковке, имеющих одни и те же методы, будет несколько (логично, т.к. инлайновые методы обычно попадают в единицу трансляции через хедеры), линкер создаст из них всех одну (1) точку входа в каждый метод (если таковой метод вообще будет нужен как отдельная сущность)
Мне почему-то сразу вспомнилось про extern template. Вроде в C++11 должно?
в отличие от нормального списка экспорта объектного модуля, где дубли будут считаться ошибкой (symbol/function XXX already defined in other.o)
> extern template
ну поглядим как это будет работать на самом деле
Рано утром я встану в очередь в Мавзолей.