【问题标题】:What does the main() function mean for a programmain() 函数对程序意味着什么
【发布时间】:2015-12-11 20:33:12
【问题描述】:

C 中的 main() 函数有什么特别之处? 在我的嵌入式 C 编译器中,它告诉程序计数器从哪里开始。无论什么首先出现(作为指令)进入 main 函数,它将首先放置在闪存中。那么PC程序呢? PC端编程时main()是什么意思?

【问题讨论】:

标签: c


【解决方案1】:

在托管实现(基本上,任何带有操作系统的东西)上,main 被定义为程序的入口点。它是程序启动时将由运行时环境调用的函数。

在独立实施(嵌入式系统、PLC 等)上,入口点是实施所说的任何内容。那可能是main,也可能是别的东西。

【讨论】:

    【解决方案2】:

    简单来说:

    main 函数没有什么特别之处,只是它在程序启动时被系统调用。

    【讨论】:

    • 不完全正确。它是唯一一个非void 函数,您可以在不返回值的情况下离开(自P99 起),并且在线程环境(POSIX 或C11)中,从main 返回会终止整个过程。
    • @JensGustedt 是的,但这就是我写“简单来说”的原因。
    【解决方案3】:

    就 C 标准而言,主函数是“C 程序”开始的地方。但是在标准之外的现实世界中,有硬件的地方,在调用 main() 之前还需要做一些其他的事情。

    在典型的嵌入式系统上,您有一个复位中断服务程序,您在上电复位(或其他复位原因)后结束。在此 ISR 中,应按以下顺序执行以下操作:

    • 设置堆栈指针。
    • 设置所有其他与内存映射相关的东西(MMU 寄存器)
    • 看门狗和低电压检测等安全功能已初始化。
    • 所有静态存储持续时间变量都已初始化。
    • main() 被调用。

    因此,当 main() 被调用时,您就有了一个足够稳定的环境,可以让标准 C 程序按预期执行。

    使用 main() 作为复位向量是非正统和非标准的。 C 标准要求在调用 main() 之前已经初始化静态存储持续时间变量。另外,你真的不想做一些基本的事情,比如在 main() 中设置堆栈指针,因为这会弄乱你在 main() 中的所有局部变量。

    【讨论】:

      【解决方案4】:

      当您的操作系统运行程序时,您的程序需要将控制权交给它。并且操作系统只知道在main() 函数处您的程序内部从哪里开始。

      【讨论】:

        【解决方案5】:

        你在网上搜索过吗?看看here,还有here。

        当操作系统以 C 语言运行程序时,它会将控制权传递给 计算机转到该程序...关键是操作系统需要知道在哪里 在您的程序内部,需要传递控件。在 C 的情况下 语言程序,它是操作系统的 main() 函数 正在寻找。

        【讨论】:

        • 好吧,简而言之,C 标准只是说,main() 在程序启动时被调用(对于 托管 环境,请参阅其他答案)。这很简单,很好,将许多实现细节留给实现。但是,您的引文试图保持简单,同时不恰当地介绍了 操作系统。在常见的情况下,操作系统只有它们的二进制格式,它们有自己关于入口点的想法,而与你的程序相关联的一点C运行时将获得控制和照顾main() 的执行。小心一些在线资源;)
        • 似乎很可能 OP 甚至没有操作系统。
        【解决方案6】:

        函数 ma​​in 很特别——你的程序在 主要的。这意味着每个程序都必须在某个地方有一个主程序。 main 通常会调用其他函数来帮助执行它的工作,一些是你写的,还有一些 来自为您提供的库。

        您可以在所有可能的 C 书籍中找到它。

        【讨论】:

          【解决方案7】:

          main 函数允许 C 程序找到程序的开头。 main 函数总是在程序启动时被调用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-14
            • 1970-01-01
            • 2013-09-15
            • 2011-12-28
            • 2020-10-12
            相关资源
            最近更新 更多