【发布时间】:2012-02-27 00:45:36
【问题描述】:
我想知道,谁调用了 C 中的 main 函数。
main 函数的实际用途是什么(为什么 main 是特殊/必要的)?
我可以写一个没有main函数的c程序吗?
【问题讨论】:
-
如果你写一个没有 main 的程序,你想象它如何工作?
我想知道,谁调用了 C 中的 main 函数。
main 函数的实际用途是什么(为什么 main 是特殊/必要的)?
我可以写一个没有main函数的c程序吗?
【问题讨论】:
最简单的答案是:程序的用户在启动应用程序时调用主函数。你用过命令终端吗?如果你有,你就会知道你可以将参数传递给命令。例如:
$ grep word myfile
幕后发生的事情是终端查看您输入的内容,然后调用 grep 程序的 main 方法并将 [word, myfile] 作为第二个参数传递给该方法。这是一个简化,但我希望它有所帮助。
【讨论】:
当您要求操作系统运行一个文件时,它会将其加载到内存中,并跳转到它的起点(_start 等)。此时,有一个代码,调用main 然后退出(链接器负责这部分)。如果你编写的程序没有main 函数,链接器将给你一个错误,因为它找不到它。
【讨论】:
main 函数实际上由 C 运行时调用。
你可以编写一个没有main 的程序,但它必须有一个入口点。不同的操作系统允许您为程序指定不同的入口点,但它们的用途都与main 相同。在 Windows 上,您可以使用 WinMain。在 Linux 上,您可以不使用 CRT 进行链接并定义您自己的 _start 函数(但它不能返回!)
没有入口点的程序就像没有轮子的汽车:它不会去任何地方。
【讨论】:
main,所以如果你使用main,你只需要重新编译。如果您使用WinMain,您的程序将无法在非Windows平台上运行。
_start 符号,它是程序的实际入口点。它不是一个函数,它不能返回,因为它没有调用者。这允许将平台上的 C 实现与操作系统内核分开。内核不关心您的调用约定,因此您可以使用任何您喜欢的调用约定。
您的程序(即捆绑在函数中的一系列代码)必须有一个起点,对吧?
必须先调用某些东西才能运行其余的东西。
所以,这个起点是main,它由你的操作系统中的父进程调用(不管它是什么)并让你的程序运行
【讨论】:
$./a.out 时,我实际上在运行哪个程序?