查找 _CRTALLOC 宏定义, 通过查找它所引用的头文件,可以看到其中的sect_attribs.h - longkai/lab.newgxu.cn GitHub Wiki
一个循环遍历,执行每个元素,而仔细看看,那每个元素不就是一个函数指针吗? OK,我们想实现前面所说的功能,该怎么做呢?怎么能够自动往里面添加我们的函数指针呢? 如果能够自由添加我们的函数指针的话,就可以在main和WinMain之前,之后分别调用我们自己的 “初始化”“退出”函数了。那么我们继续在这个源文件中“crt0dat.c”中看看其他代码,或许你会幸运的发现如下代码:
[cpp] view plaincopy
01.extern _CRTALLOC(".CRT$XIA") _PIFV __xi_a[];
02.extern _CRTALLOC(".CRT$XIZ") _PIFV __xi_z[]; /* C initializers /
03.extern _CRTALLOC(".CRT$XCA") _PVFV __xc_a[];
04.extern _CRTALLOC(".CRT$XCZ") _PVFV __xc_z[]; / C++ initializers /
05.extern _CRTALLOC(".CRT$XPA") _PVFV __xp_a[];
06.extern _CRTALLOC(".CRT$XPZ") _PVFV __xp_z[]; / C pre-terminators /
07.extern _CRTALLOC(".CRT$XTA") _PVFV __xt_a[];
08.extern _CRTALLOC(".CRT$XTZ") _PVFV __xt_z[]; / C terminators */
MS也给我们写了一点注释, __xi_a[] 到 __xi_z[] 是用于 C语言初始化用的, __xc_a[] 到 __xc_z[] 适用于C++初始化用的,而
__xp_a[] 到 __xp_z[] 适用于C基本库预结束用的, __xt_a[] 到 __xt_z[] 适用于C基本库结束用的。通过这里,我们可以看到那个字符串中的英文字母".CRT$XIA" - ".CRT$XIZ", 我们可以分析出一些简单的规律,
I --> C initialize;
C --> C++ Initialize
P --> C PreUninitialize
T --> CUninitialize