在C++程序的主要功能中,"返回0"是什么意思?

22 c++

可能重复:
主要的正确声明是什么?

如果没有特别引用任何代码,我正在寻找以下示例的解释:

#include <iostream>

int main()
{
    std::cout << "Hello world" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不明白是什么return 0.你能用尽可能简单的英语解释一下吗?

Joh*_*web 41

这定义了流程的退出状态.尽管是int类Unix系统,但值始终在0-255范围内(参见退出和退出状态).在Microsoft系统上,您可以使用32位有符号整数作为退出代码,您可以查看%ERRORLEVEL%.为了便于携带,我建议坚持0-255范围.

这是一个简单的例子:

$ cat -n exit_code.cpp 
     1  int main()
     2  {
     3      return 42;
     4  }
     5  
Run Code Online (Sandbox Code Playgroud)

建立:

$ make exit_code
g++ exit_code.cpp -o exit_code
Run Code Online (Sandbox Code Playgroud)

运行(在bash中):

$ ./exit_code
Run Code Online (Sandbox Code Playgroud)

检查退出状态:

$ echo $?
42
Run Code Online (Sandbox Code Playgroud)

通常,零状态表示成功和非零故障.这在shell脚本中非常有用,以此类推,以指示失败的级别,如果有的话:

$ ./exit_code
exit_status=$?
if [[ ${exit_status} ]] ; then
    echo "The process failed with status ${exit_status}."
else
    echo "Success!"
fi
The process failed with status 42.
Run Code Online (Sandbox Code Playgroud)

以下评论......

在标准C++ 标头中<cstdlib>,定义了以下宏:

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
Run Code Online (Sandbox Code Playgroud)

但是,GNU C Library文档Exit Status部分描述了相同的宏,sagely指出:

可移植性说明:某些非POSIX系统对退出状态值使用不同的约定.为了获得更好的可移植性,可以分别使用宏EXIT_SUCCESS和EXIT_FAILURE作为成功和失败的常规状态值.它们在文件stdlib.h中声明.

  • + 1为一个很好的明确答案:)作为OP的一个侧点,虽然42在这里很好地说明了这一点,我想我回忆说只有便携式返回码是0,EXIT_SUCCESS和EXIT_FAILURE - 所以不要使用如果您希望您的代码可移植,请使用其他功能. (3认同)
  • @frunsi:你能引用这条规则的标准吗? (2认同)
  • @Johnsyweb:是的,但AFAIK这三个是ISO C++标准中提到的三个便携式返回码.可悲的是,我没有这方面的参考,虽然快速谷歌'c ++便携式返回主要exit_success'确实似乎证实了我想说的.此外,有用和便携不一定是一回事. (2认同)
  • 伙计们,感谢评论.希望我的最新帖子@DustinStalin有足够的信息来回答他的问题. (2认同)

Lig*_*ica 8

一般returnING

每个函数都有一个返回类型.

在下面的示例中,类型是void,"不完整类型",没有值; 使用它作为返回类型意味着该函数不返回任何值:

void foo() {
   std::cout << "Hello world\n";
}
Run Code Online (Sandbox Code Playgroud)

但是,在下面的示例中,返回类型是int:

int foo() {
   return 3;
}
Run Code Online (Sandbox Code Playgroud)

return语句确定函数调用的值foo将被评估为.因此,std::cout << foo()将导致" 3"打印到标准输出.


returnmain特别是来自

当有问题的函数恰好是"主"函数或程序的入口点时,它有点特别,因为"main"函数的"返回值"被认为是程序的"退出代码" - 它告诉它调用环境(例如终端会话)是否认为程序的执行是成功的.它必须是一个int,0这里的值意味着"一切都很顺利":

值得注意的是,您实际上可以完全省略return 0; "main"函数,因为它将隐式包含在内.但是,如果您想要return 1;或其他一些值,这对您没有多大帮助,并且它不会与其他功能发挥作用.


引文

[C++11: 3.6.1/5]: return语句main具有离开main函数(销毁具有自动存储持续时间的任何对象)std::exit使用返回值作为参数进行调用的效果.如果控件到达结尾而main没有遇到return语句,则效果就是执行return 0;

[C++11: 18.5/8]:

       [[noreturn]] void exit(int status)
Run Code Online (Sandbox Code Playgroud)

该功能exit()在本国际标准中有其他行为:

  • 首先,销毁具有线程存储持续时间并与当前线程相关联的对象.
    接下来,销毁具有静态存储持续时间的对象,并调用通过调用注册的函数atexit.有关破坏和调用的顺序,请参见3.6.3.(由于调用exit(),自动对象不会被销毁.)
    如果控制离开了一个由exit调用的注册函数,因为该函数没有为抛出异常提供处理程序,terminate()则应调用(15.5.1).
  • 接下来,<cstdio>刷新所有打开的C流(由声明的函数签名调解)和未写入的缓冲数据,关闭所有打开的C流,并tmpfile()删除通过调用创建的所有文件.
  • 最后,控制权返回给主机环境.如果status为零EXIT_SUCCESS,则返回状态成功终止的实现定义形式.如果status为EXIT_FAILURE,则返回状态为不成功终止的实现定义形式.否则返回的状态是实现定义的.

Bootnote

我建议使用其中一种资源,因为在任何体面的同行评审的C++书中都能正确解释这种情况; YouTube教程不是学习C++的好方法,Stack Overflow贡献者通常会希望您在求助之前有一本体面的书来形成您之前的研究.

  • @ TomalakGeret'kal:18.5"最后,控制返回到主机环境.如果status为零或者'EXIT_SUCCESS`,则返回状态成功终止的实现定义形式.如果status为`EXIT_FAILURE`,则执行定义返回状态不成功终止的形式.否则返回的状态是实现定义的." (3认同)