1

基本上,我正在用 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()and SDL_Quit(),这两个函数都在函数中?atexit()atexit()return 1if (game.window == NULL)

据我了解,C从上到下执行代码,那么atexit()如果return 1之前发生过,它怎么知道最后调用函数呢?

4

2 回答 2

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;
}

这不会打印“再见!” ,因为atexit()在检查i之后注册。

于 2015-08-06T16:19:57.423 回答
1

首先,在您知道窗口确实已创建之前,您不能销毁窗口因此,必须在知道窗口存在之后 调用atexit(3)来注册函数以销毁窗口。(这是在右括号之后)}if

一旦你初始化了 SDL 环境,就可以调用atexit(SDL_Quit);(这是在它被正确初始化之后,所以它只会在真正初始化的环境中被调用),但它必须在调用之前调用以注册 SDL 的销毁窗口,因为atexit(3)使您注册的函数以相反的顺序被调用,因此它必须首先销毁窗口,然后关闭 SDL 环境(并且在 SDL 时调用销毁窗口的函数是没有意义的已经关闭)。

顺便说一句,atexit()需要函数指针,而不是函数调用的结果。写得更好

atexit(SDL_Quit);
atexit(SDL_DestroyWindow);

比你写的。

笔记

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

于 2015-08-07T11:56:53.920 回答