main函数执行之前和之后都做了什么?
我们都知道程序的执行是从main函数开始的,main函数是用户定义的执行入口点,但是在main函数之前和main函数之后编译器都做了什么工作呢?
1.main函数执行之前
- 设置栈指针
- 初始化static静态变量和global全局变量,即.data段的内容
- 对.bss段的未初始化的静态变量和全局变量进行赋初值,数值型short,int,long等为赋为0,bool类型为FALSE,指针为NULL等
- 初始化堆
- 执行全局对象的初始化
- 将main函数的argc和argv参数传递给main函数,然后才开始真正运行main函数。
2.main函数之后则执行与之前相反的步骤
3.如如何在main函数之前或者之后做一些操作
(1)linux环境下利用gcc的__attribute关键字:
#include<stdio.h>
__attribute((destructor)) void befor_main() {
printf("before main\n");
}
__attribute((constructor)) void befor_main() {
printf("after main\n");
}
int main(){
printf("main\n");
return 0;
}
(2)window平台下
#include <stdio.h>
void before_main()
{
printf("before main!\n");
return 0;
}
typedef int func();
#pragma data_seg(".CRT$XIU")
static func *before[] = { before_main };
#pragma data_seg()
int main()
{
printf("main\n");
return 0;
}
(3) C++下利用全局对象的构造与析构
#include<iostream>
using namespace std;
class A {
public:
A() {
cout << "before main" << endl;
}
~A() {
cout << "after main" << endl;
}
};
A a;
int main() {
cout << "main" << endl;
return 0;
}