1
C++ 및 SDL2에 대한 Lazy Foo 자습서를 따르고 있습니다. 정규 C를 사용하여 그것을 배우려고 노력 중이며 이벤트를 추가하여 닫기 창 이벤트를 감지하는 지침에 따라 흥미로운 것을 발견했습니다.Can not Close Window
다음은 코드입니다.
#include <stdio.h>
#include <stdbool.h>
#include "SDL2/SDL.h"
bool init();
bool loadMedia();
void close();
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
SDL_Window *gWindow = NULL;
SDL_Surface *gScreenSurface = NULL;
SDL_Surface *gHelloWorld = NULL;
int main(int argc, char *argv[])
{
if(!init()) {
printf("Failed to initialize!\n");
}
else {
if(!loadMedia()) {
printf("Failed to load media!\n");
}
else {
bool quit = false;
SDL_Event e;
while(!quit) {
printf("%d", SDL_PollEvent(&e));
while(SDL_PollEvent(&e) != 0) {
if(e.type == SDL_QUIT) {
quit = true;
}
}
SDL_BlitSurface(gHelloWorld, NULL, gScreenSurface, NULL);
SDL_UpdateWindowSurface(gWindow);
}
}
}
close();
return 0;
}
bool init()
{
bool success = true;
if(SDL_Init(SDL_INIT_VIDEO) < 0) {
printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
success = false;
}
else {
gWindow = SDL_CreateWindow("SDL Tutorial 03", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if(gWindow == NULL) {
printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
success = false;
}
else {
gScreenSurface = SDL_GetWindowSurface(gWindow);
}
}
return success;
}
bool loadMedia()
{
bool success = true;
gHelloWorld = SDL_LoadBMP("images/hello_world.bmp");
if(gHelloWorld == NULL) {
printf("Unable to load image %s! SDL_Error: %s\n", "images/hello_world.bmp", SDL_GetError());
success = false;
}
return success;
}
void close()
{
SDL_FreeSurface(gHelloWorld);
gHelloWorld = NULL;
SDL_DestroyWindow(gWindow);
gWindow = NULL;
SDL_Quit();
}
".c"확장명으로 컴파일하면 오류없이 컴파일되지만 창 제목 표시 줄에서 "X"를 선택하면 아무런 효과가 없습니다. 확장명을 ".cpp"로 변경하면 "X"가 의도 한대로 작동합니다.
다음 명령을 사용하여 코드를 컴파일하고 있습니다.
gcc main.c -w -lSDL2 -o main
C++에서는 작동하지만 C에서는 작동하지 않는 이유는 무엇입니까?
: 당신은 단지 대기열에 보류중인 이벤트가 있는지 확인하려면
은 다음 NULL 인수 함수 SDL_PollEvent를 사용하는이 이벤트 루프가이 이벤트를 찾을 수 없음을 의미합니다 'close()'호출에서 범위 문제일까요? '-w'로 경고를 무시하는 대신 경고를 확인할 수 있습니까? C 명령 행에서'close'를 언급하고있을 것입니다. –
'컴파일러에게 물건이 망가 졌는지 알려주지 말라고했습니다. (-w) 누군가가 왜 물건이 고장 났는지 말해 줄 수 있겠습니까? ' – kfsone
죄송합니다. 자습서에서 사용하도록 조언 한 명령이었습니다. "-w"를 제거하면 추가 오류가 발생하지 않습니다. – azurepancake