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

时间:2013-11-26 13:41:57

标签: c++

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

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

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

int main(){
     // Some code here...
}

generateNum()之前调用函数main()两次。

我的问题是

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

2 个答案:

答案 0 :(得分:7)

  

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

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

  

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

     

1程序应包含一个名为main的全局函数,即   指定的计划开始。它是实现定义的   是否需要在独立环境中的程序   定义一个主要功能。 [注意:在独立环境中,   启动和终止是实现定义的; 启动   包含命名空间对象的构造函数的执行   范围与静态存储持续时间;终止包含   执行具有静态存储持续时间的对象的析构函数。   ]

答案 1 :(得分: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]是您想要查看的内容。对于静态存储持续时间的变量,此处的行为是动态初始化