main函数的实际用途是什么(为什么main是特殊/必要的)?
我可以写一个没有主函数的C程序吗?

1 个评论
如果你写一个没有main的程序,你如何想象它的工作?
c
linux
program-entry-point
Vikram
Vikram
发布于 2012-02-05
4 个回答
Dietrich Epp
Dietrich Epp
发布于 2012-02-05
已采纳
0 人赞同

在实践中, main 函数是由C语言运行时调用的。

你可以写一个没有 main 的程序,但它 must 有一个入口点。 不同的操作系统允许你为你的程序指定不同的入口点,但它们的作用都与 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语言实现和操作系统的内核分离。 内核并不关心你的调用约定,所以你可以使用你喜欢的任何调用约定。
asaelr
asaelr
发布于 2012-02-05
0 人赞同

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

Cratylus
Cratylus
发布于 2012-02-05
0 人赞同

你的程序(是捆绑在函数里面的一系列代码)一定要有一个起点吧?

必须先调用一些东西来运行其余部分。

所以,这个起点是 main ,它被你的O/S(不管是什么)中的父进程调用,让你的程序运行。

是的,我知道,但是当我写 $./a.out 时,我实际上是在运行哪个程序?
你分叉了一个调用main的进程(这是一个ELF文件)。
Matthew
Matthew
发布于 2012-02-05
0 人赞同

最简单的答案是这样的:你的程序的用户在启动你的应用程序时调用主函数。你使用过命令终端吗?如果你用过,你会知道你可以向命令传递参数。比如说