如何在main函数之前调用其他函数
1)将要执行的代码写到类的构造函数种,并定义全局变量
在windows平台中,执行main函数之前,系统会执行一段CRTstartup代码,对系统的堆栈、全局变量、命令行参数、环境变量等进行初始化操作。我们利用对全局变量的初始化机制来让构造函数中的代码优先在main函数之前执行。
#include<iostream> #include<Windows.h> using namespace std; class Debug{ public: Debug() { cout << "I am runing before main!" << endl; } }; Debug t; int main() { cout << "I am main!" << endl; return 0; }
2)将要执行的代码写道TLS回调函数中去
TLS,是Windows为了解决一个进程中多个线程同时访问全局变量而提供的机制。TLS可以简单的由操作系统代为完成整个互斥的过程,也可以由自己编写控制信号量的函数。当进程中的线程访问预先制定的内存空间时,操作系统会调用默认的或者自定义的信号量函数,保证数据的完整性和正确性。在main函数之前,会优先执行TLS代码。
#include <Windows.h> #include <tchar.h> #include<iostream> using namespace std; #pragma comment(lib,"ntdll.lib") void NTAPI __stdcall TLS_CALLBACK(PVOID DllHandle, DWORD Reason, PVOID Reserved) { cout << "I am in Tls" << endl; } //linker spec通知链接器PE文件要创建TLS目录,注意X86和X64的区别 #ifdef _M_IX86 #pragma comment (linker, "/INCLUDE:__tls_used") #pragma comment (linker, "/INCLUDE:__tls_callback") #else #pragma comment (linker, "/INCLUDE:_tls_used") #pragma comment (linker, "/INCLUDE:_tls_callback") #endif //创建TLS段 EXTERN_C #ifdef _M_X64 #pragma const_seg (".CRT$XLB") const #else #pragma data_seg (".CRT$XLB") #endif //end linker //tls import定义多个回调函数 PIMAGE_TLS_CALLBACK _tls_callback[] = { TLS_CALLBACK, 0 }; #pragma data_seg () #pragma const_seg () //end int main() { cout << "I am in main!" << endl; return 0; }
I am in Tls I am in main! 请按任意键继续. . .

浙公网安备 33010602011771号