天天看点

main主函数执行完毕后,是否可能会再执行一段代码

可以使用atexit()函数注册一个函数

  1. #include <stdlib.h>
  2. //功能:Processes the specified function at exit.
  3. //格式:int atexit( void ( __cdecl *func )( void ) );
  4. //描述:The atexit function is passed the address of a function (func) to be
  5. // called when the program terminates normally. Successive calls to atexit 
  6. //create a register of functions that are executed in LIFO (last-in-first-out) 
  7. //order. The functions passed to atexit cannot take parameters. atexit and 
  8. //_onexit use the heap to hold the register of functions. Thus, the number of
  9. // functions that can be registered is limited only by heap memory.
  10. int atexit (void (*function)(void));
  11. #include <stdio.h>
  12. void fun1(void);
  13. void fun2(void);
  14. void fun3(void);
  15. void fun4(void);
  16. void main()
  17. {
  18.     atexit(fun1);
  19.     atexit(fun2);
  20.     atexit(fun3);
  21.     atexit(fun4);
  22.     printf("this is executed first.\n");
  23. }
  24. void fun1() 
  25. {
  26.     printf("next.\n");
  27. }
  28. void fun2()
  29. {    
  30.     printf("executed ");    
  31. }
  32. void fun3()
  33. {    
  34.     printf("is ");    
  35. }
  36. void fun4()
  37. {    
  38.     printf("this ");    
  39. }

结果:

This is executed first.

This is executed next.

注意,atexit()以栈的方式注册函数,后注册的函数会先执行

全局类的析构函数好象也在main后执行

non-local static object的构造函数在main之前执行,析构函数在main之后执行。

关于这些函数是如何执行的,以及atexit注册的函数是如何被执行的,可以参见crt的源文件。

在vc.net中,这个文件应该是在...\Microsoft Visual Studio .NET 2003\Vc7\crt\src\crt0.c

通过step into,你也可以跟踪整个程序被crt控制执行的过程。