#define TYPENAME3(N,M) N##M #define TYPENAME2(N,M) TYPENAME3(N,M) #define TYPENAME(N) TYPENAME2(LIBNAME, _my_t) typedef struct TYPENAME2(LIBNAME, _my_s) { // functions #define GO(A, B) B A; SUPER() #undef GO #ifdef ADDED_STRUCT ADDED_STRUCT() #endif } TYPENAME(LIBNAME); static library_t* my_lib = NULL; static TYPENAME(LIBNAME) TYPENAME2(my_, LIBNAME) = {0}; static TYPENAME(LIBNAME) * const my = &TYPENAME2(my_, LIBNAME); static void getMy(library_t* lib) { #define GO(A, W) my->A = (W)dlsym(lib->priv.w.lib, #A); SUPER() #undef GO my_lib = lib; #ifdef ADDED_INIT ADDED_INIT() #endif } static void freeMy() { my_lib = NULL; #ifdef ADDED_FINI ADDED_FINI() #endif } #ifndef ADDED_SUPER #undef SUPER #endif