在C和C++中定义main()函数的正确(最有效)方法是什么?int main()或void main()-为什么?那争论呢?如果int main(),则返回1或0?


这个问题有很多重复之处,包括:

C的main()函数的有效签名是什么?main()函数的返回类型void main()和int main()之间的区别?main()在C中的签名++main()的正确声明是什么?-对于C++,确实有一个非常好的答案。C中main()函数的样式C中main()方法的返回类型C中的int main()与void main()

相关:

C++-int main(int argc,char**argv)C++-int main(int argc,char*argv[])char*envp[]作为main()的第三个参数是否可移植?int main()函数必须在所有编译器中返回值吗?为什么C和C++中main()函数的类型留给用户定义?为什么int main(){}编译?C++14中main()的合法定义?


当前回答

返回0应告诉程序员程序已成功完成作业。

其他回答

main的返回值指示程序如何退出。正常出口由main的0返回值表示。异常退出是由非零返回发出的信号,但对于如何解释非零代码没有标准。正如其他人所指出的,void main()是C++标准所禁止的,不应该使用。有效的C++主签名是:

int main(void)

and

int main(int argc, char **argv)

相当于

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

还值得注意的是,在C++中,int main()可以不带return语句,此时默认返回0。C99项目也是如此。是否返回0;是否应被省略值得商榷。有效的C程序主签名的范围要大得多。

效率不是主要功能的问题。根据C++标准,只能输入和离开一次(标记程序的开始和终止)。对于C,允许重新输入main(),但应避免。

请记住,即使您返回的是int,某些OS(Windows)也会将返回的值截断为单个字节(0-255)。

成功时返回0,错误时返回非零。这是UNIX和DOS脚本用来找出程序发生了什么的标准。

C89中的main()和K&R C未指定的返回类型默认为“int”。

return 1? return 0?

如果不在int main()中编写return语句,则默认情况下关闭的}将返回0。

(仅在c++和c99以后的版本中,对于c90,您必须编写return语句。请参阅为什么main不在此处返回0?)

父进程将接收返回0或返回1。在shell中,它会进入一个shell变量,如果您以shell形式运行程序而不使用该变量,则不必担心main()的返回值。

参见如何获取主函数返回的内容?。

$ ./a.out
$ echo $?

这样您可以看到它是变量$?它接收main()返回值的最低有效字节。

在Unix和DOS脚本中,成功时返回0,错误时返回非零。这是Unix和DOS脚本用来发现程序发生了什么并控制整个流程的标准。

接受的答案似乎是针对C++的,所以我想添加一个与C相关的答案,这在一些方面有所不同。ISO/IEC 9899:1989(C90)和ISO/IEC 9899:1999(C99)之间也进行了一些更改。

main()应声明为:

int main(void)
int main(int argc, char **argv)

或同等产品。例如,int main(int argc,char*argv[])等同于第二个。在C90中,int返回类型可以省略,因为它是默认值,但在C99和更高版本中,不能省略int返回类型。

如果实现允许,main()可以用其他方式声明(例如,int main(int argc,char*argv[],char*envp[])),但这会使程序实现被定义,不再严格遵守。

标准为返回定义了三个严格一致的值(即,不依赖于实现定义的行为):0和EXIT_SUCCESS表示成功终止,EXIT_FAILURE表示失败终止。任何其他值都是非标准的,并定义了实现。在C90中,main()必须在末尾有一个显式返回语句,以避免未定义的行为。在C99和更新版本中,可以省略main()中的return语句。如果您这样做了,main()完成了,则会有一个隐式返回0。

最后,从标准的角度来看,从C程序递归调用main()并没有错。