为什么,如果我写
int main()
{
//...
}
我不需要在return 0;
函数的末尾写main
吗?编译器是否为我做了?
我使用GCC / C99。
答案 0 :(得分:19)
C99和C ++特例main
函数如果控件到达结尾但没有显式返回则返回0。此仅适用于main
功能。
对于main
特殊情况
5.1.2.2.3程序终止
如果是主函数的返回类型 是一个与int兼容的类型,a 从最初的呼叫返回到 main函数相当于调用 值为
的退出函数 由main函数返回 参数; 到达那个}
终止主函数返回 值为0.6.9.1 / 12
如果终止某个功能的
}
是 达到了,功能的价值 呼叫由呼叫者使用 行为未定义。
您可以使用gcc:
进行测试int foo ( void ) { }
int main( void ) { }
C89模式(两种功能都有错误):
sandiego:$ gcc src/no_return.c -std=c89 -Wall
src/no_return.c: In function ‘main’:
src/no_return.c:2: warning: control reaches end of non-void function
src/no_return.c: In function ‘foo’:
src/no_return.c:1: warning: control reaches end of non-void function
C99模式(主要是特例):
sandiego:$ gcc src/no_return.c -std=c99 -Wall
src/no_return.c: In function ‘foo’:
src/no_return.c:1: warning: control reaches end of non-void function
答案 1 :(得分:14)
如果在函数末尾没有显式的return语句,并且控制流出函数,那么最新的C(当前是带有一些修改的C99)默认从0
返回main
结束(见C99 TC3中的5.1.2.2.3)。这是因为无论如何,大多数人都会写这种形式的回报。
在C89中你需要返回一些东西 - 它没有这种隐含的回报。但是编译器绝不需要诊断这样的错误(参见C89 draft中的3.6.6.4和C99 TC3中的6.9.1 / 12)。
答案 2 :(得分:2)
是。 C中的main
是一个非常特殊的函数,它有一些额外的规则。请参阅C99标准中有关其终止的段落。从本质上说,如果你退出函数而不返回一个值,这就等同于你给出了0
的返回值。这对于main
来说是特殊的,对于调用函数期望返回值可能(并且会)使程序崩溃的其他函数也是如此。
如果主要的返回类型 function是一种兼容的类型 int,从最初的调用返回到 主要功能相当于 用the调用exit函数 main函数返回的值为 它的论点;达到那个 终止main函数返回一个 值为0.如果返回类型不是 兼容int,终止 状态返回给主机 环境未明确。
答案 3 :(得分:-1)
基本上,是的。函数不需要返回任何内容,即使它们声明了void
以外的返回类型。返回的值将是未定义的。
请注意,C99要求声明非void
返回类型的函数始终通过命中return语句来终止。因此,如果您使用编译器的C99模式进行编译,则此代码将导致编译时错误。