【问题标题】:Who calls the main function in C [duplicate]谁在C中调用main函数[重复]
【发布时间】:2012-02-27 00:45:36
【问题描述】:

可能重复:
In C, how is the main() method initially called?

我想知道,谁调用了 C 中的 main 函数。
main 函数的实际用途是什么(为什么 main 是特殊/必要的)?
我可以写一个没有main函数的c程序吗?

【问题讨论】:

  • 如果你写一个没有 main 的程序,你想象它如何工作?

标签: c linux main


【解决方案1】:

最简单的答案是:程序的用户在启动应用程序时调用主函数。你用过命令终端吗?如果你有,你就会知道你可以将参数传递给命令。例如:

$ grep word myfile

幕后发生的事情是终端查看您输入的内容,然后调用 grep 程序的 main 方法并将 [word, myfile] 作为第二个参数传递给该方法。这是一个简化,但我希望它有所帮助。

【讨论】:

    【解决方案2】:

    当您要求操作系统运行一个文件时,它会将其加载到内存中,并跳转到它的起点(_start 等)。此时,有一个代码,调用main 然后退出(链接器负责这部分)。如果你编写的程序没有main 函数,链接器将给你一个错误,因为它找不到它。

    【讨论】:

      【解决方案3】:

      main 函数实际上由 C 运行时调用。

      你可以编写一个没有main 的程序,但它必须有一个入口点。不同的操作系统允许您为程序指定不同的入口点,但它们的用途都与main 相同。在 Windows 上,您可以使用 WinMain。在 Linux 上,您可以不使用 CRT 进行链接并定义您自己的 _start 函数(但它不能返回!)

      没有入口点的程序就像没有轮子的汽车:它不会去任何地方。

      【讨论】:

      • 不是反过来吗?程序调用并链接到C运行时?
      • 更像是一辆没有启动引擎的汽车,汽车就在那里,它可以做它应该做的一切,但没有任何东西可以启动这个过程
      • 1) C 运行时是什么意思? 2)你的意思是如果我编写了一个在我的操作系统中完美执行的C程序......我不能在不同的操作系统上运行它,因为不同的操作系统有不同的入口点???
      • @vikram: 1) C 运行时是您平台上的 C 实现提供的代码。 2)所有兼容的平台都支持main,所以如果你使用main,你只需要重新编译。如果您使用WinMain,您的程序将无法在非Windows平台上运行。
      • @user384706:不,C 运行时通常调用 main。例如,在 Linux 上,C 运行时提供了_start 符号,它是程序的实际入口点。它不是一个函数,它不能返回,因为它没有调用者。这允许将平台上的 C 实现与操作系统内核分开。内核不关心您的调用约定,因此您可以使用任何您喜欢的调用约定。
      【解决方案4】:

      您的程序(即捆绑在函数中的一系列代码)必须有一个起点,对吧?

      必须先调用某些东西才能运行其余的东西。

      所以,这个起点是main,它由你的操作系统中的父进程调用(不管它是什么)并让你的程序运行

      【讨论】:

      • 是的,我知道,但是当我写 $./a.out 时,我实际上在运行哪个程序?
      • 你 fork 一个调用 main 的进程(这是一个 ELF 文件)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      相关资源
      最近更新 更多