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


当前回答

ISO现在要求C和C++都使用“int”作为“main”的返回类型。

这两种语言以前都允许隐式“int”,而“main”的声明没有任何返回类型。事实上,C++的第一个外部版本(1985年2月发布的“cfront”E版),用自己的语言编写,声明为“main”,没有任何返回类型。。。但返回了一个整数值:错误数或127,以较小者为准

至于返回什么的问题:C和C++的ISO标准与POSIX标准同步工作。对于符合POSIX标准的任何托管环境,(1) 126为OS的外壳保留以指示不可执行的实用程序,(2) 127为OS的外壳保留,(3) 公用设施的退出值在逐个公用设施的基础上单独列出,(4) 调用外壳外部的实用程序的程序应该为它们自己的出口使用类似的值,(5) 值128和以上用于指示由于接收信号而导致的终止,(6) 值1-125表示故障,(7) 值0表示成功。

在C和C++中,值EXIT_SUCCESS和EXIT_FAILURE用于处理最常见的情况:用于报告成功或仅报告一般失败的程序。它们可以但不必分别等于0和1。

这意味着,如果您希望程序为不同的故障模式或状态指示返回不同的值,同时继续使用这两个常量,您可能必须首先确保附加的“故障”或“状态”值严格位于max(EXIT_SUCCESS,EXIT_failure)和126之间(并希望两者之间有足够的空间),并保留EXIT_FAILURE以标记通用或默认故障模式。

否则,如果你不打算使用常量,那么你应该按照POSIX的要求去做。

对于在独立环境或不符合POSIX的主机上使用的程序,我只能说以下几点:

我已经编写了独立的程序——作为自定义运行时系统上的多线程程序(以及其他一切的自定义工具库)。我遵循的一般规则是:(1) “main”运行前台进程,通常仅由启动、配置或初始化例程组成,但也可能包含用于连续操作的前台进程(如轮询循环),(2) “main”返回到无限睡眠和等待循环,(3) 未定义或使用“main”的返回值,(4) 后台进程单独运行,作为中断驱动和事件驱动线程,独立于“主”,仅在收到重置信号或其他线程时终止。。。或者简单地关闭对驱动线程的任何事件的监视。

其他回答

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脚本用来发现程序发生了什么并控制整个流程的标准。

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

ISO现在要求C和C++都使用“int”作为“main”的返回类型。

这两种语言以前都允许隐式“int”,而“main”的声明没有任何返回类型。事实上,C++的第一个外部版本(1985年2月发布的“cfront”E版),用自己的语言编写,声明为“main”,没有任何返回类型。。。但返回了一个整数值:错误数或127,以较小者为准

至于返回什么的问题:C和C++的ISO标准与POSIX标准同步工作。对于符合POSIX标准的任何托管环境,(1) 126为OS的外壳保留以指示不可执行的实用程序,(2) 127为OS的外壳保留,(3) 公用设施的退出值在逐个公用设施的基础上单独列出,(4) 调用外壳外部的实用程序的程序应该为它们自己的出口使用类似的值,(5) 值128和以上用于指示由于接收信号而导致的终止,(6) 值1-125表示故障,(7) 值0表示成功。

在C和C++中,值EXIT_SUCCESS和EXIT_FAILURE用于处理最常见的情况:用于报告成功或仅报告一般失败的程序。它们可以但不必分别等于0和1。

这意味着,如果您希望程序为不同的故障模式或状态指示返回不同的值,同时继续使用这两个常量,您可能必须首先确保附加的“故障”或“状态”值严格位于max(EXIT_SUCCESS,EXIT_failure)和126之间(并希望两者之间有足够的空间),并保留EXIT_FAILURE以标记通用或默认故障模式。

否则,如果你不打算使用常量,那么你应该按照POSIX的要求去做。

对于在独立环境或不符合POSIX的主机上使用的程序,我只能说以下几点:

我已经编写了独立的程序——作为自定义运行时系统上的多线程程序(以及其他一切的自定义工具库)。我遵循的一般规则是:(1) “main”运行前台进程,通常仅由启动、配置或初始化例程组成,但也可能包含用于连续操作的前台进程(如轮询循环),(2) “main”返回到无限睡眠和等待循环,(3) 未定义或使用“main”的返回值,(4) 后台进程单独运行,作为中断驱动和事件驱动线程,独立于“主”,仅在收到重置信号或其他线程时终止。。。或者简单地关闭对驱动线程的任何事件的监视。

在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),则“返回到主机环境的状态未指定”(即大多数操作系统上的未定义行为)。

main()的返回值显示程序如何退出。如果返回值为零,则表示执行成功,而任何非零值都表示执行中出现了问题。