【发布时间】:2013-12-29 10:36:57
【问题描述】:
int main()
{
return 0;
}
谁在执行 main 函数后收到值 0?之后这个值有什么用?
【问题讨论】:
标签: c++ return-value main
int main()
{
return 0;
}
谁在执行 main 函数后收到值 0?之后这个值有什么用?
【问题讨论】:
标签: c++ return-value main
执行一个程序的效果和单次调用是一样的:
std::exit(main(/* args */))
所以main 的返回值是exit 的单个参数,无论这对您的系统意味着什么。
注意标准只定义了两个返回值,EXIT_SUCCESS和EXIT_FAILURE。返回零等效于返回EXIT_SUCCESS。其他一切都由实现定义。
【讨论】:
在 Unix(类)系统上,您可以向 shell 发出退出状态信号(假设 bash):
$ ./your-program
$ echo $?
0
在bash中,$?是上一条命令的退出码。
【讨论】:
从main() 函数返回一个值等同于使用该值调用exit()。所以你的代码类似于:
int main() {
std::exit(0);
}
退出状态返回给运行时库。它可以被调用程序的父进程访问;在 Unix 上,这是使用 wait() 系列调用完成的。如果您从 Unix shell 运行程序,退出状态将放在变量 $? 中,或者您可以使用 if 或 while 等控制语句对其进行测试。
【讨论】:
操作系统可能会使用这个值。在大多数操作系统中,您可以在程序运行后查询此值。如何执行此操作取决于操作系统。
【讨论】:
main 的返回值被传递给调用你的程序的进程。
【讨论】:
调用你的程序的程序。在上述情况下,它是 OS shell 或执行程序的批处理文件/脚本。
【讨论】:
返回值作为参数status 传递给status,然后它会进行一些整理并将退出状态返回给宿主环境:
最后,控制权返回到宿主环境。如果状态为零或 EXIT_SUCCESS,则 返回成功终止状态的实现定义形式。如果状态为 EXIT_FAILURE,则返回状态未成功终止的实现定义形式。否则返回的状态是实现定义的。
【讨论】:
考虑一个执行子程序的程序。很多时候这将是一个外壳/终端/控制台。当一个孩子退出时,它可以告诉它的父母它已经完成以及它是否成功。
考虑更改目录的程序cd 和删除一些文件的rm。如果您要编写一个 cd 到一个目录的程序,然后删除所有带有 rm * 的文件,那么 shell/console/terminal 能够判断 cd 命令是否成功非常重要,否则内容可以删除当前目录。
shell 调用例如cd 命令上的waitpid 并检查返回的值。基于该返回值,shellscript 程序员可以决定调用rm 或进行一些错误处理。
【讨论】: