为什么main()
是用户定义的函数?
何时使用void main()
和int main()
?
为什么main()
是用户定义的函数?
何时使用void main()
和int main()
?
编辑:这个答案并不是非常完整,因为它没有真正解释奇怪的句子"或以某种实现定义的方式"。我已经写了一个更完整的答案,它还涵盖了C90、C11和C++。 编辑结束
以下是C标准所说的(ISO C 9899:1999):
5.1.2.1 自由环境
在自由环境中(程序不受操作系统影响执行的情况),调用程序启动时的函数的名称和类型是由实现定义的。 / .. / 在自由环境中,程序终止的效果是由实现定义的。
5.1.2.2 托管环境
托管环境可有可无,但如果存在,必须符合以下规范。
5.1.2.2.1 程序启动
在程序启动时调用的函数名为 main。 实现不为此函数声明原型。 它应该具有返回类型int且没有参数:
int main(void) { /* ... */ }
或具有两个参数(这里称为argc和argv,但可以使用任何名称,因为它们是在声明它们的函数中局部的):
int main(int argc, char* argv[]) { /* ... */ }
C ++标准中的文本基本相同。 请注意,“程序启动”在文本中是托管环境的“子条款”。
这意味着:
如果您的程序运行在无主机环境下(您的程序是嵌入式系统或操作系统),它可以有任何返回类型。void main() 是最常见的。
如果您的程序运行在托管环境中(在操作系统之上),main() 必须返回 int,并且可能具有其他参数。
main
函数的返回类型是实现定义的:这并不意味着由程序员决定,而是被平台强制规定的。编译器手册应该会说明这一点。在托管环境中,参数的选择确实只有两个给定的备选项。如果存在参数,则必须恰好为两个,并且具有给定的类型。顺便说一下,我认为你漏掉了 argv
的一个 *
。 - Jens Gustedtmain
函数的返回类型为除int
以外的其他类型。5.1.2.1的措辞存在歧义,但是5.1.2.2.3开头写道:“如果main函数的返回类型与int兼容…” - Keith Thompsonvoid main(void)
。(而且你所描述的行为并不会使Turbo C不符合标准;如果实现没有记录它,定义void main()
就会产生未定义的行为,但它并不需要诊断。) - Keith ThompsonLundin 关于 C 的说法是正确的,但在 C++ 中措辞已经足够明确以产生差异:
[C++11: 3.6.1/1]:
程序必须包含一个名为main
的全局函数,该函数是程序的指定起点。在自由环境中是否需要定义main
函数是实现定义的。
[C++11: 3.6.1/2]:
实现不应预定义main
函数。该函数不得重载。它应该返回类型为int
的返回值,但其余部分的类型是实现定义的 [..]
第一个加粗的段落不会覆盖或取消第二个段落。
main
在 C++ 中始终返回 int
。
void
……但也仅仅只限于此。 - Bartek Banachewicz注意:在独立环境中,启动和终止是实现定义的
”。我不知道为什么C++11中的措辞发生了变化,但这只能合理地解释为“独立实现可以完全按照自己的意愿声明main函数”。对于没有任何操作系统的程序或操作系统本身来说,返回int是没有意义的。他们会把int返回给谁呢? - Lundinmain
通常返回int
。在独立环境中,入口点甚至可能没有命名为main
,但其返回类型仍然由实现而非程序员确定。
main
的函数。实现定义了程序如何启动。
在 2 中,程序从一个名为 main
的函数开始执行,该函数使用以下两个“签名”之一定义:int main(void)
或 int main(int argc, char **argv)
在 3 中,程序从一个名为 main
的函数开始执行,该函数按实现允许的方式定义。此函数必须返回 int
才能符合标准。例如: int main(int argc, char **argv, char **envp)
或 int main(wchar_t**)
。请注意,使用这些形式的程序并不一定在所有托管实现中都有效(如果实现更改,则可能对原始作者无效)。void main(void)
仍然是无效的。标准允许托管实现接受实现定义的参数到 main
,但不允许接受不同的返回类型。 - R.. GitHub STOP HELPING ICEmain
函数返回int
类型;而C语言允许实现定义的形式返回其他类型。 - Keith Thompson({...})
似乎不会与语言的任何要求冲突,但即使它是针对通常使用 gcc 的平台而设计的,我也会犹豫地称使用它们的程序为“有效的 C”。 - R.. GitHub STOP HELPING ICE最初,在C语言中,没有void
这种类型,因此函数必须返回int
。
实际上,返回int
允许您从您的进程中运行另一个进程(使用fork
和exec
),如果您可以从该进程获取返回结果,则会知道它是否起作用。
许多编译器不支持void main(),因此您应该始终使用int main()。
main
不同之处在于选择集更窄。 - Keith Thompson