在我的程序中我调用atexit()的位置是否重要?

时间:2015-08-06 16:07:43

标签: c return sdl atexit

基本上,我正在用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)调用函数?

2 个答案:

答案 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);

比你写的还要多。

如果函数需要参数,最好编写函数包装器以使用适当的参数调用它们。