在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()的合法定义?
在C和C++中定义main()函数的正确(最有效)方法是什么?int main()或void main()-为什么?
这些词“(最有效)”并不能改变问题。除非您处于独立的环境中,否则有一种普遍正确的方法来声明main(),那就是返回int。
main()在C和C++中应该返回什么?
一个int,纯粹而简单。它不仅仅是“应该返回什么”,而是“必须返回什么”。main()当然是其他人调用的函数。您无法控制调用main的代码。因此,必须使用类型正确的签名声明main以匹配其调用者。你在这件事上没有任何选择。你不必问自己什么效率更高或更低,什么风格更好或更差,或者诸如此类的问题,因为答案已经由C和C++标准完美地定义了。跟着他们就行了。
如果int main(),则返回1或0?
0表示成功,非零表示失败。同样,这不是你需要(或得到)选择的东西:它是由你应该遵守的接口定义的。
省略返回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结尾,没有编写显式返回的实例。尽管该文件中还没有关于这一特定主题的具体准则,但这似乎至少是对这一做法的默认认可。
所以我主张省略它;其他人不同意(通常是激烈的!)在任何情况下,如果你遇到省略了它的代码,你会知道它是由标准明确支持的,你也会知道它的含义。
这里有一个关于返回代码用法的小演示。。。
当使用Linux终端提供的各种工具时,可以使用返回代码,例如在过程完成后进行错误处理。假设存在以下文本文件myfile:
这是一些示例,以检查grep的工作原理。
执行grep命令时,将创建一个进程。一旦它通过(并且没有中断),它将返回一些介于0和255之间的代码。例如:
$ grep order myfile
如果你这样做
$ echo $?
$ 0
您将获得0。为什么?因为grep找到了匹配项并返回了退出代码0,这是成功退出的通常值。原因可能在于简单检查是否一切正常的布尔性质。对0(布尔值假)的简单否定返回1(布尔值真),这可以在if-else语句中轻松处理。
让我们再次检查它,但不在文本文件中,因此不会找到匹配项:
$ grep foo myfile
$ echo $?
$ 1
由于grep未能将标记“foo”与文件内容匹配,因此返回代码为1(这是发生故障时的常见情况,但如上所述,您有很多值可供选择)。同样,如果我们将其放在简单的布尔上下文中(一切正常与否),则否定1(布尔值为真)会产生0(布尔值假),这同样可以通过if-else语句轻松处理。当涉及布尔值时,任何不是0的值都被视为等同于1(因此,在用于检查是否发生错误的简单if-else语句中,2、3、4等的工作方式与使用1的情况相同)。您可以使用不同的返回值来增加错误状态的粒度。对于成功执行的状态,使用0以外的任何值都被认为是不好的做法(由于上面给出的原因)。
以下bash脚本(只需在Linux终端中键入它)虽然非常基本,但应该能给出一些错误处理的概念:
$ grep foo myfile
$ CHECK=$?
$ [ $CHECK -eq 0] && echo 'Match found'; [ $CHECK -ne 0] && echo 'No match was found'
$ No match was found
在第二行之后,由于“foo”使grep返回1,所以没有任何内容打印到终端,我们检查grep的返回代码是否等于0。第二个条件语句在最后一行回显其消息,因为由于CHECK==1,它是真的。
正如您所看到的,如果您正在调用这个和那个进程,有时需要查看它返回了什么(通过main()的返回值),例如在运行测试时。