C++程序进入main函数之前,退出main函数之后会做些啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++程序进入main函数之前,退出main函数之后会做些啥?相关的知识,希望对你有一定的参考价值。

我们看下面的例子:
    
    /* file name test00.c */
    
    int main(int argc, char* argv)
    
     return 0;
    
    
    编译链接它:
    cc test00.c -o test.exe
    会生成 test.exe
    
    但是我们加上这个选项: -nostdlib (不链接标准库)
    cc test00.c -nostdlib -o test.exe
    链接器会报错:
    undefined symbol: __start
    
    也就是说:
    1. 编译器缺省是找 __start 符号,而不是 main
    2. __start 这个符号是程序的起始点
    3. main 是被标准库调用的一个符号
通常,我们会在编译器的环境中找到一个名字类似于 crt0.o 的文件,这个文件中包含了我们刚才所说的 __start 符号。

那么真正的 crt0.s 是什么样子呢?下面我们给出部分伪代码:
    
    ///////////////////////////////////////////////////////
    section .text:
    __start:
    
     :
     init stack;
     init heap;
     open stdin;
     open stdout;
     open stderr;
     :
     push argv;
     push argc;
     call _main; (调用 main)
     :
     destory heap;
     close stdin;
     close stdout;
     close stderr;
     :
     call __exit;
    ////////////////////////////////////////////////////

总结:
main函数执行之前,主要就是初始化系统相关资源:
1.设置栈指针
2.初始化static静态和global全局变量,即data段的内容
3.将未初始化部分的赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容
4.运行全局构造器,估计是C++中构造函数之类的吧
5.将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数

main 函数之后会执行相反的工作。

参考资料:http://www.cppblog.com/aa19870406/archive/2011/03/08/141386.html

参考技术A 我的理解,这是一个很高级的问题,main函数之前和之后其实是会隐性执行两个函数的,这两个函数如果你重写的话,就会被执行,如果你不写的话就会被按照空来调用一次,但函数的具体名字我给忘了,惭愧。 参考技术B main之前是预处理部分,main之后是类的析构函数调用。系统存储分配,内存释放等应该不算c++程序干的吧,是操作系统的工作 参考技术C main函数执行之前,主要就是初始化系统相关资源:
1.设置栈指针
2.初始化static静态和global全局变量,即data段的内容
3.将未初始化部分的赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容
4.运行全局构造器,估计是C++中构造函数之类的吧
5.将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数

main 函数之后会执行相反的工作。
参考技术D 进入之前 先去执行头文件 调用数据库或其他 执行类等
退出后 指针自己释放 函数 自动析构 所以main函数执行完毕,应该是不做什么了
一点浅见 有错 海涵啊 呵呵

我可以从 Main 构造函数中关闭程序吗?

【中文标题】我可以从 Main 构造函数中关闭程序吗?【英文标题】:Can I close the program from the Main constructor? 【发布时间】:2010-10-18 06:05:05 【问题描述】:

你能在构造函数完成并加载主窗体之前退出应用程序吗?

在启动时,我有一个加载屏幕,在加载主窗体之前显示。在构造函数完成之前从构造函数显示加载屏幕。

我通过在主窗体和退出屏幕之间使用变量来对退出屏幕执行类似的操作。如果退出屏幕返回 true,我在主窗体中有一个应用程序退出。

最后,所有线程/类/加载/程序设置应该在主构造函数中完成还是我做错了?

更新:

我的意思是在 program.cs 之后和静态 main 中

namespace app

 public partial class app1 : Form
 
   public app1()
     
      InitializeComponent();
      // open loading screen
      // initialize vars
      // create objects
   
 // form opens when app1() finishes
    app1() 是初始化所有内容的正确位置吗? 如果我尝试在 app1() 完成之前从加载屏幕发回“关闭”消息,它不起作用 - 即使没有任何内容打开,该进程仍然运行。

【问题讨论】:

【参考方案1】:

哪个类的主构造函数?

您说的是在Program 类中具有默认位置的静态方法Main

您使用该方法执行在屏幕上打开任何窗口之前需要进行的初始化。

显然,如果您需要使用加载屏幕,您可能需要将一些代码移动到其他地方,因为您需要围绕表单的消息循环,并且消息循环将阻塞直到您的表单关闭。

如果在打开任何表单之前从 Main 方法返回,则不会明显显示任何表单。

说了这么多,我觉得你的问题有点含糊,我很确定我不明白你在问什么。

首先,Main 不是构造函数,它只是一个静态方法。

【讨论】:

【参考方案2】:

当主线程结束时:

后台线程被“杀死/放弃” 等待前台线程(创建线程时的默认设置)直到它们完成。

【讨论】:

【参考方案3】:

你只能通过抛出异常来破坏构造函数。要偷偷地这样做,请抛出您自己的特定异常。

class ConstructorAbortedException : Exception  

class Foo

  public Foo()
  
    if(goesWrong)
    
      throw new ConstructorAbortedException();
    
  


void Bar()

  try
  
    Foo f = new Foo();
  
  catch(ConstructorAbortedException)
  
    //..
  

【讨论】:

【参考方案4】:

我发现,当我仍然在不同线程上显示初始屏幕(看起来与您正在做的事情相似)时,如果我尝试从主窗体构造函数中终止我的应用程序,Application.Exit() 不起作用,但Environment.Exit(-1) 可以。

【讨论】:

【参考方案5】:

试试这个,


    public partial class MyForm : Form
            
    public MyForm()
    
     if (MyFunc())
        
            this.Shown += new EventHandler(MyForm_CloseOnStart);
        
    

    private void MyForm_CloseOnStart(object sender, EventArgs e)
    
         this.Close();
    
    

它会很好用......

【讨论】:

同样的事情使用 lambda:Shown += (sender, e) => Close();【参考方案6】:

正如 jontsnz 回答的那样,代码与 Environment.Exit(-1) 在构造函数中工作正常,但这会导致应用程序引发“应用程序挂起”事件,这在 Windows 事件查看器中可以被视为错误。使用 Environment.Exit(0) 虽然没有注册错误就退出了,所以我更喜欢那个。

【讨论】:

以上是关于C++程序进入main函数之前,退出main函数之后会做些啥?的主要内容,如果未能解决你的问题,请参考以下文章

C++语言怎么在main函数执行之前执行一段代码

我可以从 Main 构造函数中关闭程序吗?

请教各位大侠C++中程序在开始main()函数之前的执行顺序是怎么样的?

深度剖析C语言的main函数!

戒除void main()陋习

干货 | 深度剖析C语言的main函数