Go to the documentation of this file. 61 #ifndef AUTOINIT_FUNCS_INCLUDED 62 #define AUTOINIT_FUNCS_INCLUDED 1 68 #define AUTOINIT_FUNCS_VERSION 0x01000001 72 #ifdef __has_attribute 73 #if !__has_attribute(constructor) || !__has_attribute(destructor) 74 #define _GNUC_ATTR_CONSTR_NOT_SUPPORTED 1 79 #if defined(__GNUC__) && !defined(_GNUC_ATTR_CONSTR_NOT_SUPPORTED) 81 #define GNUC_SET_INIT_AND_DEINIT(FI,FD) \ 82 void __attribute__ ((constructor)) _GNUC_init_helper_##FI(void) \ 84 void __attribute__ ((destructor)) _GNUC_deinit_helper_##FD(void) \ 86 struct _GNUC_dummy_str_##FI{int i;} 88 #define _SET_INIT_AND_DEINIT_FUNCS(FI,FD) GNUC_SET_INIT_AND_DEINIT(FI,FD) 89 #define _AUTOINIT_FUNCS_ARE_SUPPORTED 1 91 #elif defined (_MSC_FULL_VER) && _MSC_VER+0 >= 1600 104 #define _INSTRMACRO(a) #a 105 #define _STRMACRO(a) _INSTRMACRO(a) 107 #if !defined(_USRDLL) || defined(AUTOINIT_FUNCS_DECLARE_STATIC_REG) 114 #define W32_INITVARDECL extern "C" 116 #define W32_INITVARDECL extern 120 #if defined(_M_X64) || defined(_M_AMD64) 121 #define W32_VARDECORPREFIX 122 #define W32_DECORVARNAME(v) v 123 #define W32_VARDECORPEFIXSTR "" 124 #elif defined(_M_IX86) || defined(_X86_) 125 #define W32_VARDECORPREFIX _ 126 #define W32_DECORVARNAME(v) _##v 127 #define W32_VARDECORPEFIXSTR "_" 129 #error Do not know how to decorate symbols for this architecture 133 #define W32_INITHELPERVARNAME(f) _initHelperDummy_##f 134 #define W32_INITHELPERVARNAMEDECORSTR(f) W32_VARDECORPEFIXSTR _STRMACRO(W32_INITHELPERVARNAME(f)) 142 #define W32_FPTR_IN_SEG(S,F) \ 143 __pragma(section(S,long,read)) \ 144 __pragma(comment(linker, "/INCLUDE:" W32_INITHELPERVARNAMEDECORSTR(F))) \ 145 W32_INITVARDECL __declspec(allocate(S)) int(__cdecl *W32_INITHELPERVARNAME(F))(void) = &F 148 #define W32_SEG_INIT_C_USER ".CRT$XCU" 149 #define W32_SEG_INIT_C_LIB ".CRT$XCL" 150 #define W32_SEG_INIT_CXX_USER ".CRT$XIU" 151 #define W32_SEG_INIT_CXX_LIB ".CRT$XIL" 159 #define W32_REG_INIT_C_USER(F) W32_FPTR_IN_SEG(W32_SEG_INIT_C_USER,F) 160 #define W32_REG_INIT_C_LIB(F) W32_FPTR_IN_SEG(W32_SEG_INIT_C_LIB,F) 161 #define W32_REG_INIT_CXX_USER(F) W32_FPTR_IN_SEG(W32_SEG_INIT_CXX_USER,F) 162 #define W32_REG_INIT_CXX_LIB(F) W32_FPTR_IN_SEG(W32_SEG_INIT_CXX_LIB,F) 172 #if ((defined(_LIB) && !defined(_CONSOLE)) || defined(_USRDLL)) && !defined(AUTOINIT_FUNCS_FORCE_USER_LVL_INIT) 173 #define W32_REGISTER_INIT(F) W32_REG_INIT_CXX_LIB(F) 175 #define W32_REGISTER_INIT(F) W32_REG_INIT_CXX_USER(F) 178 #if ((defined(_LIB) && !defined(_CONSOLE)) || defined(_USRDLL)) && !defined(AUTOINIT_FUNCS_FORCE_USER_LVL_INIT) 179 #define W32_REGISTER_INIT(F) W32_REG_INIT_C_LIB(F) 181 #define W32_REGISTER_INIT(F) W32_REG_INIT_C_USER(F) 187 #ifndef WIN32_LEAN_AND_MEAN 188 #define WIN32_LEAN_AND_MEAN 1 195 #if !defined(_USRDLL) || defined(AUTOINIT_FUNCS_FORCE_STATIC_REG) 196 #define W32_SET_INIT_AND_DEINIT(FI,FD) \ 197 void __cdecl _W32_deinit_helper_##FD(void) \ 199 int __cdecl _W32_init_helper_##FI(void) \ 200 { (void)(FI)(); atexit(_W32_deinit_helper_##FD); return 0; } \ 201 W32_REGISTER_INIT(_W32_init_helper_##FI) 206 #ifndef AUTOINIT_FUNCS_CALL_USR_DLLMAIN 207 #define W32_SET_INIT_AND_DEINIT(FI,FD) \ 208 BOOL WINAPI DllMain(HINSTANCE hinst,DWORD reason,LPVOID unused) \ 209 { if(DLL_PROCESS_ATTACH==reason) {(void)(FI)();} \ 210 else if(DLL_PROCESS_DETACH==reason) {(void)(FD)();} \ 212 } struct _W32_dummy_strc_##FI{int i;} 214 #define W32_SET_INIT_AND_DEINIT(FI,FD) \ 215 BOOL WINAPI usr_DllMain(HINSTANCE hinst,DWORD reason,LPVOID unused); \ 216 BOOL WINAPI DllMain(HINSTANCE hinst,DWORD reason,LPVOID unused) \ 217 { if(DLL_PROCESS_ATTACH==reason) {(void)(FI)();} \ 218 else if(DLL_PROCESS_DETACH==reason) {(void)(FD)();} \ 219 return usr_DllMain(hinst,reason,unused); \ 220 } struct _W32_dummy_strc_##FI{int i;} 224 #define _SET_INIT_AND_DEINIT_FUNCS(FI,FD) W32_SET_INIT_AND_DEINIT(FI,FD) 226 #define _AUTOINIT_FUNCS_ARE_SUPPORTED 1 232 #ifdef EMIT_ERROR_IF_AUTOINIT_FUNCS_ARE_NOT_SUPPORTED 233 #error Compiler/platform don not support automatic calls of user-defined initializer and deinitializer 237 #define _SET_INIT_AND_DEINIT_FUNCS(FI,FD) 239 #define _AUTOINIT_FUNCS_ARE_NOT_SUPPORTED 1