__attribute__((constructor)) void before_main() {
printf("%s\n", __FUNCTION__);
}
__attribute__((destructor)) void after_main() {
printf("%s\n", __FUNCTION__);
}
int main(int argc, char **argv) {
printf("%s\n", __FUNCTION__);
return 0;
}
輸出順序:before_main → main → after_main
支持多個構造/析構函數,按定義順序/逆序執行。
#pragma data_seg(".CRT$XIU") // 初始化段:XCU~XCUZ之間任意字母排序
static void (*before[])(void) = { before_main };
#pragma data_seg(".CRT$XPU") // 終止段:XPU~XPUZ之間
static void (*after[])(void) = { after_main };
#pragma data_seg()
段命名規則:
.CRT$XCU:C++全局對象構造函數.CRT$XIU:用戶定義初始化(排在XCU後).CRT$XPU:用戶定義終止(排在XPZ前)#ifdef _MSC_VER
#define CONSTRUCTOR(f) \
static void f(void); \
#pragma data_seg(".CRT$XIU") \
static void (*f##_ptr)(void) = f; \
#pragma data_seg() \
static void f(void)
#define DESTRUCTOR(f) \
static void f(void); \
#pragma data_seg(".CRT$XPU") \
static void (*f##_ptr)(void) = f; \
#pragma data_seg() \
static void f(void)
#elif defined(__GNUC__)
#define CONSTRUCTOR(f) __attribute__((constructor)) static void f(void)
#define DESTRUCTOR(f) __attribute__((destructor)) static void f(void)
#endif
.init_array/.fini_array