在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

当C或C++程序到达main结尾时,编译器将自动生成返回0的代码,因此不需要将返回值设置为0;明确地在main的末尾。

注意:当我提出这个建议时,后面几乎总是两种评论中的一种:“我不知道。”或“这是坏建议!”我的理由是,依赖标准明确支持的编译器行为是安全和有用的。对于C,自C99以来;见ISO/IEC 9899:1999第5.1.2.2.3节:

[…]从初始调用返回到主函数相当于用主函数返回的值作为其参数调用退出函数;到达终止主函数的}返回值0。

对于C++,自1998年第一个标准以来;见ISO/IEC 14882:1998第3.6.1节:

如果控件到达main的结尾而没有遇到return语句,则效果是执行return 0;

从那时起,两种标准的所有版本(C99和C++98)都保持了相同的想法。我们依赖于C++中自动生成的成员函数,很少有人编写显式返回;void函数末尾的语句。反对省略的理由似乎归结为“看起来很奇怪”。如果像我一样,你对C标准更改的原因感到好奇,请阅读这个问题。还要注意,在20世纪90年代初,这被认为是“草率的做法”,因为当时这是一种未定义的行为(尽管得到广泛支持)。

此外,C++核心指南包含省略返回0的多个实例;在main结尾,没有编写显式返回的实例。尽管该文件中还没有关于这一特定主题的具体准则,但这似乎至少是对这一做法的默认认可。

所以我主张省略它;其他人不同意(通常是激烈的!)在任何情况下,如果你遇到省略了它的代码,你会知道它是由标准明确支持的,你也会知道它的含义。

其他回答

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

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

返回什么取决于您要对可执行文件执行什么操作。例如,如果您使用带有命令行shell的程序,则需要返回0表示成功,返回非零表示失败。然后,您就可以根据代码的结果在shell中使用带有条件处理的程序。此外,您还可以根据您的解释分配任何非零值,例如,对于严重错误,不同的程序退出点可以终止具有不同退出值的程序,调用shell可以通过检查返回的值来决定要做什么。如果代码不打算与shell一起使用,并且返回的值不会影响任何人,那么可以省略它。我个人使用签名int main(void){..return 0;..}

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

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