什么在main()之前运行?

时间:2011-01-10 23:51:33

标签: c++

在msvc8上测试后,我发现:

  1. 将GetCommandLine()解析为argc和argv
  2. 标准C库初始化
  3. C ++全局变量的构造函数
  4. 在进入main()之前调用这三件事。

    我的问题是:

    1. 当我将程序移植到不同的编译器(gcc或armcc)或不同的平台时,这个执行顺序会不同吗?
    2. 标准C库初始化有什么作用?到目前为止,我知道setlocale()是必须的。
    3. 在全局变量的C ++构造函数中调用标准C函数是否安全?

2 个答案:

答案 0 :(得分:5)

  

1:当我将程序移植到不同的编译器(gcc或armcc)或不同的平台时,这个执行顺序会不同吗?

  

2:标准C库初始化有什么作用?到目前为止,我知道setlocale()是必须的。

我确信还有其他的东西。在main启动后,您不应该依赖任何全局对象util。这意味着像std streams(std :: cin,std :: cout)这样的东西可能无法使用。

  

3:在全局变量的C ++构造函数中调用标准C函数是否安全?

可能不是。

答案 1 :(得分:4)

这是来自LSB(Linux标准库)工作的article,描述了__libc_start_main在Linux上的作用。

具体做法是:

* performing any necessary security checks if the effective user
  ID is not the same as the real user ID.
* initialize the threading subsystem.
* registering the rtld_fini to release resources when this dynamic
  shared object exits (or is unloaded).
* registering the fini handler to run at program exit.
* calling the initializer function (*init)().
* calling main() with appropriate arguments.
* calling exit() with the return value from main().

这是一个more detailed explanation

这与Windows完全不同。