程序执行没有在main()开始

Dan*_*HsH 7 c++

我在C开发了很多年,现在才发现一个程序可以在main()函数之前执行代码.这是一个代码示例

int generateNum(){
    // Some malicious code here...
    return 5;
}

static int someArray[] = {generateNum(),generateNum()}  

int main(){
     // Some code here...
}
Run Code Online (Sandbox Code Playgroud)

该函数generateNum()之前被调用两次main().

我的问题是

  1. 谁调用generateNum()?我知道在Windows上它是crtexe()
  2. 这种行为是否在不同平台上标准化:Windows/Linux/Android/iOS?
  3. 如何获得有关此行为的更多信息?我想在谷歌搜索,但我不知道如何描述它.
  4. 我可以在generateNum()中做任何我想做的事吗?我的意思是,我可以调用malloc()吗?那fopen()和fwrite()怎么样?我可以打开套接字并通过UDP发送信息吗?最终我可以滥用这个功能甚至从它调用main():-)

Sad*_*que 7

程序应包含一个名为main的全局函数,它是程序的指定开始.

它并没有说在main调用之前没有代码执行.完整报价:

3.6.1主要功能[basic.start.main]

1程序应包含一个名为main的全局函数,它是程序的指定开始.实现定义是否需要独立环境中的程序来定义主函数.[注意:在独立环境中,启动和终止是实现定义的; start-up包含具有静态存储持续时间的命名空间作用域对象的构造函数的执行; 终止包含具有静态存储持续时间的对象的析构函数的执行.]


cre*_*hen 7

  1. C++保证之前会发生这种初始化main.这可以由操作系统加载器/链接器或由包含的目标文件链接的某些特殊模块来处理main.对于gcc,这里描述:http: //gcc.gnu.org/onlinedocs/gccint/Initialization.html
  2. 不完全的.C++ 11,3.6.2.4(basic.start.init):实现定义了具有静态存储持续时间的非局部变量的动态初始化是否在main的第一个语句之前完成. 请注意,在您可以访问该值之前进行初始化,尤其是在对同一编译单元中的实体有任何引用概念之前.
  3. 语言标准中的[basic.start.init]是您想要查看的内容.此处的行为是具有静态存储持续时间的变量的动态初始化.