我在没有定义SDL_main的情况下使用SDL功能。那很好吗?

时间:2015-12-04 01:13:26

标签: c++ sdl sdl-2

这是我的代码:

Lib.h

#ifdef ExportLib
    #define Lib __declspec(dllexport)
#else
    #define Lib __declspec(dllimport)
#endif
extern void Lib Launch();

Lib.cpp

#include <SDL/SDL.h>
#include "Lib.h"
void Launch() {
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_Window* win = SDL_CreateWindow("Untitle", 100, 100, 400, 400, 0);
    SDL_DestroyWindow(win);
    SDL_Quit();
}

我将此代码构建到静态库。然后我创建了一个新的源文件并使用了这个库。

的main.cpp

#include "Lib.h"

int main() {
    Launch();
    return 0;
}

最后,我使用静态库编译main.cpp,而不定义SDL_main和SDL的依赖。工作正常,窗口出现。

但是真的很好吗?我失去了哪些功能?

2 个答案:

答案 0 :(得分:5)

SDL_main is for SDL's automatic initialization and cleanup.这主要是因为您不需要手动执行此操作,但它也需要在平台上为窗口应用程序正确设置所有内容。 ;编译,但它fine #define SDL_MAIN_HANDLED之前#include main SDL.h之前,这将阻止SDL转向SDL_main进入SDL_main的宏只需确保在您自己的代码中正确初始化并退出SDL。

如果您想确保自己正确进行必要的初始化,可以just check the source code并模拟其中的内容。

编辑:

在某些平台上,SDL_Init will fail如果您不使用SDL_SetMainReady。您可以在SDL_Init之前调用SDL_SetMainReady来禁用此失败,但请注意这将禁用SDL的错误处理,如果您在调用{{1}}后未正确初始化SDL,则表示您已赢得&#39 ; t得到最清楚的错误消息。

退出SDL为much more straightforward(如果您未使用SDL_main,也需要执行此操作):

完成SDL后,只需致电SDL_Quit即可。这将正确关闭当前活动的任何SDL子系统。

答案 1 :(得分:1)

  

我在没有定义SDL_main的情况下使用SDL功能。那没关系吗?

可能,可能不是。请改用SDL_SetMainReady()来确定:

  

SDL_SetMainReady:使用此功能可以避免在不使用SDL_main()作为入口点时SDL_Init() 失败

相关问题