在main函数执行之前和执行之后执行的方法<转载>
2012-03-29 21:13
399 查看
main函数执行之前,主要就是初始化系统相关资源:
后来看到一本书,详细阐述了main之前和之后的详细机理,十分推荐阅读:
程序员的自我修养 --链接、装载与库
实际上,在可执行文件被加载之后,控制权立即交给由编译器插入的Start函数,它将对后面这些全局变量进行准备:
_osver 操作系统的构件编号
_winmajor 操作系统的主版本号
_winminor 操作系统的次版本号
_winver 操作系统完全版本号
__argc 命令行参数个数
__argv 指向参数字符串的指针数组
_environ 指向环境变量字符串的指针数组
Start函数初始化堆并调用main函数.mian函数返回之后,Start函数调用Exit函数结束该进程.
启动函数Start的源代码在:
crt0.c Microsoft Visual C++
#include <stdio.h>
#include <stdlib.h>
static void before(void) __attribute__ ((constructor));
static void after(void) __attribute__ ((destructor));
static void middle(void);
static void before()
{
fprintf(stderr, "In %s %d\n", __func__, __LINE__);
}
static void after()
{
fprintf(stderr, "In %s %d\n", __func__, __LINE__);
}
static void middle()
{
fprintf(stderr, "In %s %d\n", __func__, __LINE__);
}
int main(void)
{
atexit(middle);
return 0;
}
通过指定(注册)
static void before(void) __attribute__ ((constructor));
表明这个函数应该在main之前执行
static void after(void) __attribute__ ((destructor));
表明函数在main之后执行
atexit表明函数在退出的时候执行
后来看到一本书,详细阐述了main之前和之后的详细机理,十分推荐阅读:
程序员的自我修养 --链接、装载与库
实际上,在可执行文件被加载之后,控制权立即交给由编译器插入的Start函数,它将对后面这些全局变量进行准备:
_osver 操作系统的构件编号
_winmajor 操作系统的主版本号
_winminor 操作系统的次版本号
_winver 操作系统完全版本号
__argc 命令行参数个数
__argv 指向参数字符串的指针数组
_environ 指向环境变量字符串的指针数组
Start函数初始化堆并调用main函数.mian函数返回之后,Start函数调用Exit函数结束该进程.
启动函数Start的源代码在:
crt0.c Microsoft Visual C++
#include <stdio.h>
#include <stdlib.h>
static void before(void) __attribute__ ((constructor));
static void after(void) __attribute__ ((destructor));
static void middle(void);
static void before()
{
fprintf(stderr, "In %s %d\n", __func__, __LINE__);
}
static void after()
{
fprintf(stderr, "In %s %d\n", __func__, __LINE__);
}
static void middle()
{
fprintf(stderr, "In %s %d\n", __func__, __LINE__);
}
int main(void)
{
atexit(middle);
return 0;
}
通过指定(注册)
static void before(void) __attribute__ ((constructor));
表明这个函数应该在main之前执行
static void after(void) __attribute__ ((destructor));
表明函数在main之后执行
atexit表明函数在退出的时候执行
相关文章推荐
- <转载>深入学习JavaScript: apply 方法 详解
- AsyncTask<String ,Integer,Integer>类中各个方法的执行先后顺序
- <转载学习>子类对父类构造方法调用小结
- java反射机制初步认识<二>获取并执行方法
- <转载>WdatePicker日历控件使用方法
- 常用js跳转页面方法大全,onClick,history,location <转载篇>
- struts中<html:radio>标签默认选中的解决方法《转载》
- 消除temp ts暴涨的方法<转载>
- 使用<a>标签提交action会执行两次后台方法的原因(反射机制小实例问题的解决)
- List<>中Sort()、Find()、FindAll()、Exist()的使用方法
- HTML5 <audio>/<vedio> 标签属性,方法,事件汇总
- 使用<jsp:include>,不想写死URL,动态生成URL的解决的方法
- GCD 扫盲篇<转载>
- jquery的html()方法里的<script></script>,只能出现一次,再出现的话,里面的js就不执行!!!
- <iostream> 和 <iostream.h>的区别 及 Linux下编译iostream.h的方法
- <Effectives STL>笔记之在STL容器中删除元素的方法选择
- <转载>在C#中利用Keep-Alive处理Socket网络异常断开的方法
- JSONP一种使用<script>元素获取数据的方法
- 关于List<T>和ArrayList<T>执行效率问题
- <Android>inflate的方法参数说明