为什么在C++中我们需要使用`int main`而不是`void main`?

46

在C++中,为什么需要使用int main而不是void main

8个回答

44

简短回答是因为C++标准要求main()函数返回一个int类型的值。

你可能知道,main()函数的返回值被运行时库用作进程的退出码。Unix和Win32都支持在进程结束后返回一个(小)整数的概念。从main()函数返回一个值为程序员提供了一种指定这个值的方式。


这有点晚了,但我认为C标准只定义了int main()和int main(int argc, char *argv[])。 - Powerlord
C标准允许将main定义为int main(void)int main(int argc, char *argv[])或其等效形式,也可以以“其他实现定义方式”进行定义。 C++标准的要求类似,但必须始终定义main()返回int(仅适用于托管环境;自由环境(即嵌入式)系统可以任意定义程序的入口点。) - Keith Thompson
4
“短”答案其实就是唯一的答案。允许使用 void main() { ... } 完全可以,你仍然可以使用 exit() 向环境返回一个退出码,或者在 main 结束时默认返回 0。不使用 void main() 的原因是语言标准不允许这样做,就像它不允许 double main(long long foo, time_t bar) 一样。 - Keith Thompson

18

大多数操作系统会将应用程序成功或失败的信息返回给用户或调用进程。在脚本编写中,这特别有用,可以根据程序的结果进行条件分支(if-then)。类似以下方式:

// pseudo-code
screenscrape  http://mydatasource.com > results.txt
if errorlevel == 0 then
   processfile results.txt
else
   echo Screen Scraping Failed!
end if

通过 main 函数的返回值来确定程序执行状态。

尽管有些编译器允许使用 void main,但为了符合 ANSI 标准并保持简单一致,main 函数只有一个原型:

int main(int argc, char *argv[]);

因为在C语言中,参数由调用者清理,main函数的作者可以忽略声明或处理参数argc和argv。然而,如果调用main的设置程序期望int类型的返回值,而事实上没有找到返回值,行为可能是未定义的。

简短回答:

  • main函数的返回值对于脚本编写很有用。
  • 调用main的设置和清理例程需要使用一致的接口。

1
我喜欢你的解释。你能提供一个实际可用的示例脚本吗? - saurabh gupta

8

void main() { }

改为

int main() { }

在后续版本中的主要原因是向正在运行的操作系统通知程序执行期间发生的错误

return 0;

如果返回的数字不是0,则表示程序已成功执行,这意味着发生了某些错误,其错误代码是由main函数返回的。如果您正在使用CodeBlocks IDE,请查看构建日志,如果主函数返回0,则通常会显示。

Process terminated with status 0

否则,它会以红色显示状态码,表示发生了错误。

感谢您的解释。 - WISAM

1

来自维基百科:

从主函数返回的值成为进程的退出状态,尽管C标准仅将特定含义归属于两个值:EXIT_SUCCESS(传统上为零)和EXIT_FAILURE。其他可能的返回值的含义是由实现定义的。


0

因为int是程序可以返回给操作系统的返回代码。

您可以查询此值以检查操作是否成功。

在使用命令行脚本时,这非常有帮助。


1
它仍然很有用。命令行脚本并没有死亡,你知道吗?;-) - peSHIr

0

或许是因为从main()方法中以清晰的状态码退出是有意义的。在Java中,我们必须使用System.exit()来模拟这一点,但这并不十分优雅。


0
当我们执行程序以检查其是否成功运行时,如果返回0,则表示它是正确的并且已成功运行;如果返回1,则表示未成功运行,并且这个int值告诉操作系统程序是否成功运行。

0

就像在C语言中一样,因为进程将会给操作系统一个退出码。

你可以选择使用

int main (int argc, char ** argv)
{
  return (0);
}

或者

int main (int argc, char ** argv)
{
  exit (0);
}

我记得这至少是在C89中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接