C++ 未在main()上启动程序执行

C++ 未在main()上启动程序执行,c++,C++,我用C语言开发了很多年,直到现在才发现程序可以在main()函数之前执行代码。 下面是一个代码示例 int generateNum(){ // Some malicious code here... return 5; } static int someArray[] = {generateNum(),generateNum()} int main(){ // Some code here... } 函数generateNum()在main()之前被调用两次

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

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

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

int main(){
     // Some code here...
}
函数
generateNum()
main()
之前被调用两次

我的问题是

  • 谁调用generateNum()?我知道在Windows上它是crtexe()
  • 这种行为在不同的平台上是否标准化:Windows/Linux/Android/iOS
  • 如何获取有关此行为的更多信息?我想在谷歌搜索,但我不知道如何描述它
  • 我可以在generateNum()中执行任何操作吗?我是说,我可以调用malloc()吗?那么fopen()和fwrite()呢?我可以打开套接字并通过UDP发送信息吗?最终我可以滥用这个函数,甚至从它调用main():-)
  • 程序应包含一个名为main的全局函数,该函数是程序的指定起点

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

    3.6.1主要功能[基本.启动.主要]

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

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

  • 静态对象是在输入main之前初始化的,这符合标准(我确定是C++标准,但我认为也是C)。事实上,在输入main之前,可以使用伪静态从其构造函数调用某些代码。需要注意的是,您不知道初始化的顺序。它甚至可以在同一台机器上的编译之间进行更改,这取决于链接顺序、对象文件布局和月球的阶段-1对于一个虚构的问题。此代码不是有效的C。在该语言中,全局初始值设定项必须是常量,因此
    main
    是要执行的第一个用户提供的代码。我可以从初始化函数调用malloc()吗?那么fopen()和fwrite()呢?我可以打开一个套接字,并在UDP上发送信息吗?@达尼埃尔希,不,你提到的所有东西。P.S.,我只是尝试了MalCocor(),它在Windows和Linux上工作。@丹尼尔希什,我希望它能工作(因为你可能想要使用的许多容器类将使用动态内存分配),但我不知道——C++有很多规则和例外。但是,因为这里我们讨论的是C++独占特性,所以不希望使用<代码> MARROCK()<代码>;相反,请使用
    new
    new[]
    ,除非您有很好的理由不这样做(例如,与免费的
    C代码接口)。