基本上,我正在用SDL编写一个程序。
这是代码的一部分:
// create game window
game.window = SDL_CreateWindow(
"Game",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
160,
144,
0
);
if (game.window == NULL)
{
fprintf(stderr, "Window error: %s\n", SDL_GetError());
return 1;
}
atexit(SDL_DestroyWindow());
atexit(SDL_Quit());
return 0;
}
我的问题如下。考虑到C的程序性质,如果(game.window == NULL)
是这种情况并且return 1
执行会发生什么。程序是否以return 1
终止而不调用此atexit()
语句之后的if
函数?
尽管SDL_DestroyWindow()
函数位于SDL_Quit()
atexit()
之后,但该程序仍然会调用atexit()
和return 1
if (game.window == NULL)
函数1}} - 声明
据我了解,C从上到下执行代码,那么如果atexit()
之前发生了return 1
,那么如何在(RequestID, Date, Product, Price)
调用函数?
答案 0 :(得分:2)
你是对的,它不会调用那些用atexit()注册的函数。
为了显示这种行为,我写了一个小代码片段。
#include <stdlib.h>
#include <stdio.h>
void bye()
{
printf("Bye!\n");
}
int main(int argc, char *argv[])
{
int i = 1;
if (i) {
printf("Ending\n");
return 0;
}
atexit(bye);
return 0;
}
这不会打印&#34;再见!&#34; ,因为 atexit()在检查 I 强>
答案 1 :(得分:1)
首先,你不能破坏窗口,然后才知道你创建了它所以调用 atexit(3)来注册该函数来销毁它在您知道窗口存在后,窗口必须 。 (这是在}
)的if
结束括号
对atexit(SDL_Quit);
的调用可能会在您初始化SDL环境后完成(这是在它被正确引入之后,因此只会在真正的初始化环境中调用)但必须调用 之前注册SDL窗口的破坏的调用,因为 atexit(3)使你注册的函数以相反的顺序被调用,所以它必须首先去掉窗口然后关闭SDL环境(当SDL已经关闭时,调用一个破坏窗口的函数是没有意义的。)
顺便说一句, atexit()需要函数指针,而不是函数调用的结果。最好写
atexit(SDL_Quit);
atexit(SDL_DestroyWindow);
比你写的还要多。
如果函数需要参数,最好编写函数包装器以使用适当的参数调用它们。