Go to the documentation of this file. 63 #ifndef AUTOINIT_FUNCS_INCLUDED 64 #define AUTOINIT_FUNCS_INCLUDED 1 70 #define AUTOINIT_FUNCS_VERSION 0x01000100 74 #ifdef __has_attribute 75 #if ! __has_attribute (constructor) || ! __has_attribute (destructor) 76 #define _GNUC_ATTR_CONSTR_NOT_SUPPORTED 1 83 #if (defined(__GNUC__) && ! defined(_GNUC_ATTR_CONSTR_NOT_SUPPORTED)) || \ 84 (defined(__SUNPRO_C) && __SUNPRO_C + 0 >= 0x5100) 86 #define GNUC_SET_INIT_AND_DEINIT(FI,FD) \ 87 void __attribute__ ((constructor)) _GNUC_init_helper_ ## FI (void) \ 89 void __attribute__ ((destructor)) _GNUC_deinit_helper_ ## FD (void) \ 91 struct _GNUC_dummy_str_ ## FI {int i;} 93 #define _SET_INIT_AND_DEINIT_FUNCS(FI,FD) GNUC_SET_INIT_AND_DEINIT (FI,FD) 94 #define _AUTOINIT_FUNCS_ARE_SUPPORTED 1 96 #elif defined (_MSC_FULL_VER) && _MSC_VER + 0 >= 1600 109 #define _INSTRMACRO(a) #a 110 #define _STRMACRO(a) _INSTRMACRO (a) 112 #if ! defined(_USRDLL) || defined(AUTOINIT_FUNCS_DECLARE_STATIC_REG) 119 #define W32_INITVARDECL extern "C" 121 #define W32_INITVARDECL extern 125 #if defined(_M_X64) || defined(_M_AMD64) 126 #define W32_VARDECORPREFIX 127 #define W32_DECORVARNAME(v) v 128 #define W32_VARDECORPEFIXSTR "" 129 #elif defined(_M_IX86) || defined(_X86_) 130 #define W32_VARDECORPREFIX _ 131 #define W32_DECORVARNAME(v) _ ## v 132 #define W32_VARDECORPEFIXSTR "_" 134 #error Do not know how to decorate symbols for this architecture 138 #define W32_INITHELPERVARNAME(f) _initHelperDummy_ ## f 139 #define W32_INITHELPERVARNAMEDECORSTR(f) W32_VARDECORPEFIXSTR _STRMACRO ( \ 140 W32_INITHELPERVARNAME (f)) 148 #define W32_FPTR_IN_SEG(S,F) \ 149 __pragma (section (S,long,read)) \ 150 __pragma (comment (linker, "/INCLUDE:" W32_INITHELPERVARNAMEDECORSTR (F))) \ 151 W32_INITVARDECL __declspec(allocate (S))int (__cdecl * W32_INITHELPERVARNAME ( \ 155 #define W32_SEG_INIT_C_USER ".CRT$XCU" 156 #define W32_SEG_INIT_C_LIB ".CRT$XCL" 157 #define W32_SEG_INIT_CXX_USER ".CRT$XIU" 158 #define W32_SEG_INIT_CXX_LIB ".CRT$XIL" 166 #define W32_REG_INIT_C_USER(F) W32_FPTR_IN_SEG (W32_SEG_INIT_C_USER,F) 167 #define W32_REG_INIT_C_LIB(F) W32_FPTR_IN_SEG (W32_SEG_INIT_C_LIB,F) 168 #define W32_REG_INIT_CXX_USER(F) W32_FPTR_IN_SEG (W32_SEG_INIT_CXX_USER,F) 169 #define W32_REG_INIT_CXX_LIB(F) W32_FPTR_IN_SEG (W32_SEG_INIT_CXX_LIB,F) 179 #if ((defined(_LIB) && ! defined(_CONSOLE)) || defined(_USRDLL)) && \ 180 ! defined(AUTOINIT_FUNCS_FORCE_USER_LVL_INIT) 181 #define W32_REGISTER_INIT(F) W32_REG_INIT_CXX_LIB (F) 183 #define W32_REGISTER_INIT(F) W32_REG_INIT_CXX_USER (F) 186 #if ((defined(_LIB) && ! defined(_CONSOLE)) || defined(_USRDLL)) && \ 187 ! defined(AUTOINIT_FUNCS_FORCE_USER_LVL_INIT) 188 #define W32_REGISTER_INIT(F) W32_REG_INIT_C_LIB (F) 190 #define W32_REGISTER_INIT(F) W32_REG_INIT_C_USER (F) 196 #ifndef WIN32_LEAN_AND_MEAN 197 #define WIN32_LEAN_AND_MEAN 1 204 #if ! defined(_USRDLL) || defined(AUTOINIT_FUNCS_FORCE_STATIC_REG) 205 #define W32_SET_INIT_AND_DEINIT(FI,FD) \ 206 void __cdecl _W32_deinit_helper_ ## FD (void) \ 207 { (void) (FD) (); } \ 208 int __cdecl _W32_init_helper_ ## FI (void) \ 209 { (void) (FI) (); atexit (_W32_deinit_helper_ ## FD); return 0; } \ 210 W32_REGISTER_INIT (_W32_init_helper_ ## FI) 215 #ifndef AUTOINIT_FUNCS_CALL_USR_DLLMAIN 216 #define W32_SET_INIT_AND_DEINIT(FI,FD) \ 217 BOOL WINAPI DllMain (HINSTANCE hinst,DWORD reason,LPVOID unused) \ 218 { if (DLL_PROCESS_ATTACH==reason) {(void) (FI) ();} \ 219 else if (DLL_PROCESS_DETACH==reason) {(void) (FD) ();} \ 221 } struct _W32_dummy_strc_ ## FI {int i;} 223 #define W32_SET_INIT_AND_DEINIT(FI,FD) \ 224 BOOL WINAPI usr_DllMain (HINSTANCE hinst,DWORD reason,LPVOID unused); \ 225 BOOL WINAPI DllMain (HINSTANCE hinst,DWORD reason,LPVOID unused) \ 226 { if (DLL_PROCESS_ATTACH==reason) {(void) (FI) ();} \ 227 else if (DLL_PROCESS_DETACH==reason) {(void) (FD) ();} \ 228 return usr_DllMain (hinst,reason,unused); \ 229 } struct _W32_dummy_strc_ ## FI {int i;} 233 #define _SET_INIT_AND_DEINIT_FUNCS(FI,FD) W32_SET_INIT_AND_DEINIT (FI,FD) 235 #define _AUTOINIT_FUNCS_ARE_SUPPORTED 1 241 #ifdef EMIT_ERROR_IF_AUTOINIT_FUNCS_ARE_NOT_SUPPORTED 243 Compiler/platform don not support automatic calls of user-defined initializer and deinitializer 247 #define _SET_INIT_AND_DEINIT_FUNCS(FI,FD) 249 #define _AUTOINIT_FUNCS_ARE_NOT_SUPPORTED 1