在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()的合法定义?


当前回答

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(),但应避免。

其他回答

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(),但应避免。

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

在C中,C11标准第5.1.2.2.1节(强调矿井):

应使用返回类型int和no来定义参数:int main(void){/*…*/}或者使用两个参数(这里称为argc和argv可以使用任何名称,因为它们是所在函数的本地名称声明):int main(int argc,char*argv[]){/*…*/}

然而,对于像我这样的初学者来说,一个抽象的例子可以让我掌握它:

在程序中编写方法时,例如int read_file(char filename[LEN]);,然后,作为此方法的调用方,您希望知道一切是否顺利(因为可能会发生故障,例如找不到文件)。通过检查方法的返回值,您可以知道一切是否顺利,这是该方法向您发出成功执行(或失败)的信号,并让调用者(例如,在主方法中)决定如何处理意外失败的机制。

现在想象一下,我为一个用于更复杂系统的微机构编写了一个C程序。当系统调用微机制时,它想知道一切是否按预期进行,以便能够处理任何潜在的错误。如果C程序的主方法返回void,那么调用系统如何知道其子系统(微机制)的执行?它不能,这就是main()返回int的原因,以便向调用方传达成功(或失败)的执行。

换句话说:

原因是主机环境(即操作系统(OS))需要知道程序是否正确完成。如果没有int兼容类型作为返回类型(例如void),则“返回到主机环境的状态未指定”(即大多数操作系统上的未定义行为)。

操作系统可以使用返回值来检查程序是如何关闭的。

返回值0通常意味着大多数操作系统(我无论如何都能想到的操作系统)正常。

当您自己调用进程时,也可以检查它,看看程序是否退出并正确完成。

这不仅仅是一个编程惯例。

我认为main()应该返回EXIT_SUCCESS或EXIT_FAILURE。它们在stdlib.h中定义