是否有必要在Main()中返回一个值?

时间:2011-12-04 15:44:18

标签: c return-type

当我遇到C程序的return语句/退出语句时,我只是编写了一个计算某些内容的快速程序。

我将main()声明为int类型,因此我必须返回一个整数,否则我的程序将无法正确编译。但是,main成为Boolean甚至是void是否可以接受?

我知道创建C程序的标准方法是返回一个值,以便可以解决任何问题,但是Boolean不会以相同的方式工作吗?另外,我是否可以声明void并且在终止后仍然运行我的程序时操作系统没有问题?

感谢您的帮助。

7 个答案:

答案 0 :(得分:6)

C99标准说:(§5.1.2.2.1程序启动

  

程序启动时调用的函数名为main。实施宣布否   这个功能的原型。它应该用返回类型int 定义,并且没有   参数:

int main(void) { /* ... */ }
     

或有两个参数(这里称为argc和argv,但可能有任何名称   使用,因为它们是声明它们的函数的本地函数):

int main(int argc, char *argv[]) { /* ... */ }
     

或同等的;或者以其他一些实现定义的方式。

因此,在托管环境中,int是唯一有效的标准返回类型。实现可以定义其他入口点。

请注意,第5.1.2.2.3节程序终止部分包含:

  

如果main函数的返回类型是与int兼容的类型,则从中返回   对main函数的初始调用相当于使用值调用exit函数   由main函数返回作为其参数; 到达终止的   main函数返回值0 。如果返回类型与int不兼容,则   返回到主机环境的终止状态未指定。

所以,只要您的main返回main,您就可以在C99中省略int的合法回复。 (但以前版本的C标准没有main的例外 - 没有返回值(或没有返回语句到达最终})导致“终止状态返回到主机环境[未定义] 。“。)

答案 1 :(得分:2)

这是一个可能感兴趣的link。似乎你的问题的答案不是那么顺利。我也看到编译器(MS Visual C)接受void作为返回类型。

答案 2 :(得分:1)

摘要:您不一定非必须,但您应该这样做。

在C90中,在不执行main()语句的情况下到达return的末尾“返回到主机环境的终止状态未定义”。在我使用的至少一个系统中,返回的状态为1,在该系统上表明程序失败。

C99添加了一条新规则,称到达main()的末尾返回0.(C ++具有相同的规则。)并非所有编译器都完全实现C99,而那些通常不符合C99的编译器默认编译器。

您可以从main()返回的唯一可移植值为0,EXIT_SUCCESSEXIT_FAILURE(后两者在<stdlib.h>。0和{{1}中定义表示程序成功(并且EXIT_SUCCESS通常定义为0); EXIT_SUCCESS表示程序失败。EXIT_FAILURE很常见,但不可移植;我曾经在系统(VMS),终止状态为1表示成功。如​​果您希望程序可移植,请使用return 1;表示失败;这就是它的用途。某些系统和程序定义其他系统特定或应用程序 - 具体的状态代码。

对于可移植性(以及恕我直言,样式),最好在EXIT_FAILURE结尾处进行明确的return 0;,尽管在所有情况下都不需要。添加一行代码(最糟糕的是,无害)要比浪费时间确定是否需要它更容易。

请注意main()的正确定义是:

main()

int main(void) { /* ... */ }

或等效文件(例如,您可以编写int main(int argc, char *argv[]) { /* ... */ } 而不是char **argv)。 char *argv[]是否有效是值得怀疑的,由于微妙的原因,我不会在这里讨论。同样,添加int main() { /* ... */ }关键字比在浪费时间确定是否需要它更容易。

许多书籍和教程都使用voidvoid main()。特定的编译器可能会选择允许这样做,但它不可移植。在书籍或教程中看到void main(void)是一个很好的迹象,表明作者不太了解C标准,你应该找到其他的东西来学习。

答案 3 :(得分:0)

调用main()的代码期望它返回int(或调用exit())。您无法更改调用main()(它是操作系统或运行时的一部分)的代码,因此您最好返回int。

答案 4 :(得分:0)

根据ISO,标准是返回int。见本文件第5.1.2.2.1节:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf。同样有趣的是Stroustrup对这个与C和C ++相关的问题的评论:http://www2.research.att.com/~bs/bs_faq2.html#void-main

答案 5 :(得分:0)

返回类型必须为int,如其他答案所述。但是,您假设必须根据此返回值是错误的,main是一个例外。 C99标准规定了这一点,因此在不使用return的情况下实现main是完全正确的。

答案 6 :(得分:0)

在ANSI C中,main ()通常具有int的返回类型,但它实际上可以是实现定义的;这意味着不同的编译器和平台接受不同的签名,但标准的int main ()int main (int, char**) 保证格式正确。

它与其他非void函数不同,因为它不需要return语句。如果没有提供,并且返回类型被指定为int,则编译程序就像在return 0;中的最后一个语句之后存在隐式main ()一样。

标准的相关部分:

  

5.1.2.2.3程序终止

     

1 如果main函数的返回类型是与int兼容的类型,则来自return   对main函数的初始调用等同于使用值调用exit函数   由main函数返回作为其参数;到达终止的}   main函数返回值0。如果返回类型与int不兼容,则   返回到主机环境的终止状态未指定。

不要引用我这个,但是在K + R中,事情有点宽松,我认为你甚至不需要指定一个返回类型,所以{{ 1}}实际上是一个有效的K + R程序。