c-初始化SDL后的errno 11



用SDL_Init和IMG_Init初始化SDL后,我观察errno上的代码11。这意味着资源暂时不可用。但我不知道为什么。请帮我解决这个问题。在初始化前后,我观察到errno的值。

#include <stdio.h>
#include <stdlib.h>
#include "../includes/init.h"
#include "../includes/map.h"
#include "../includes/startGame.h"
#include <errno.h>
int main(int argc, char const *argv[]){
int game = 1;
SDL_Window* screen = NULL;
SDL_Renderer *screen_render = NULL;
SDL_Event e;
initAllScreenAndRenderer(&screen, &screen_render);
while (game){
while (SDL_PollEvent(&e)){
switch (e.type){
case SDL_QUIT:
game=0;
break;
case SDL_KEYDOWN:
switch (e.key.keysym.sym){
case  SDLK_a:
play(&screen_render);
break;
}
break;
}
}
SDL_RenderClear(screen_render);
SDL_RenderPresent(screen_render);
}
destroyAllScreenAndRenderer(&screen, &screen_render);
}
void initAllScreenAndRenderer(SDL_Window **window, SDL_Renderer **window_renderer){
printf("n%dn", errno);
if (SDL_Init(SDL_INIT_VIDEO) == -1 || IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG){
printf("nError of initialisation : %sn", SDL_GetError());
exit(-1);
}
printf("n%dn", errno);
*window = SDL_CreateWindow(GAME_NAME, SDL_WINDOWPOS_UNDEFINED, `SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGTH, SDL_WINDOW_SHOWN);`
if (*window==NULL){
printf("nError of initialisation window : %sn", SDL_GetError());
exit(-1);
}
printf("n%dn", errno);
*window_renderer = SDL_CreateRenderer(*window, -1, SDL_RENDERER_ACCELERATED);
if (*window_renderer==NULL){
printf("nError of initialisation renderer : %sn", SDL_GetError());
exit(-1);
}
printf("n%dn", errno);
}

如果函数没有报告错误,则不应检查errno。函数可以设置errno(通常作为副作用(,即使它成功了。

以前的情况是这样的(可能现在仍然是,但我已经好几年没有检查了(,Solaris上的许多标准I/O函数在输出不到终端时会将errno设置为ENOTTY,即使该函数成功了。这是完全合法的。

参见C标准§7.4错误<errno.h>§3,其中写道:

程序启动时,初始线程中errno的值为零(其他线程中errno的初始值不确定(,但任何库函数都不会将其设置为零202(errno的值可以通过库函数调用设置为非零,无论是否存在错误,前提是errno的使用没有记录在本国际标准中的函数描述中。

202(因此,使用errno进行错误检查的程序应在库函数调用之前将其设置为零,然后在随后的库函数调用前对其进行检查。当然,库函数可以在条目中保存errno的值,然后将其设置为零,只要在返回之前errno的值仍然为零,就可以恢复原始值。


TL;DR——除非函数报告故障,并且记录了在故障时将errno设置为有意义的值,否则不要检查errno

相关内容

  • 没有找到相关文章

最新更新