我正在编写一个游戏,其中许多不同的条件都可能导致失败,例如图像或着色器无法加载,OpenGL无法获得有效的上下文等等。
在一个理想的世界中,我想以我认为用于C的方式使用退出代码,即对于失败条件非零。但是,有一些因素可以解决这个问题:
atexit()
,因为我的程序清理是通过atexit()
中main()
的{{1}}注册来分层处理的,我喜欢这样。 在我的情况下,使用非零退出代码可以支持和反对哪些参数?
答案 0 :(得分:5)
atexit()
函数与您的问题相反,即使程序试图将非零终止状态返回到主机环境,仍会调用向atexit()
注册的函数。对[{1}}或exit()
函数返回的调用将触发使用main()
注册的函数,无论给出的值如何。
示例:
atexit()
即使返回#include <stdlib.h>
#include <stdio.h>
void print_stuff()
{
puts("Stuff");
}
int main()
{
atexit(print_stuff);
exit(1);
}
,也会打印Stuff
。
根据ISO C标准,1
中注册的函数在调用atexit()
后调用。以下情况也定义为调用exit()
(因此触发使用exit()
注册的函数):
atexit()
返回相当于调用main()
。
在最后一个帖子调用exit()
后,会调用thrd_exit()
。
以下是可能的实现定义的调用来源exit(EXIT_SUCCESS)
:
exit()
的默认信号处理程序。
使用SIGTERM
之前的默认约束处理程序。
标准提到以下情况:set_constraint_handler_s()
以及对exit()
注册的函数的调用被规避:
未处理的atexit()
或SIGABRT
完成由注册SIGABRT
的函数处理。可以signal()
提出SIGABRT
。
致电abort()
。
致电_Exit()
。
在不调用quick_exit()
注册的函数的情
您选择的退出代码对游戏来说无关紧要。是的,您不会依赖shell脚本来运行游戏并向用户报告错误。对于像Linux这样的系统,错误反馈可能以对话框弹出窗口,日志或stderr的形式更有用。