可以在SDL_Init()之前调用SDL_GetBasePath()和SDL_GetPrefPath()吗?

时间:2017-09-04 15:05:13

标签: sdl sdl-2

在我的应用程序中,我想使用配置文件。但是我在这里遇到鸡和蛋问题:配置文件甚至可以描述SDL(和其他东西)应该如何初始化。因此,我需要在SDL_GetPrefPath()之前调用SDL_Init()以获得以每个用户为基础存储应用程序配置的公共位置。我不确定是否可能。我也需要SDL_GetBasePath()用于类似(后备)的目的,我知道这很难看,但有些用户可能会选择尝试查找配置文件。读取配置文件本身不是问题,因为我没有使用与SDL相关的功能,尽管我需要获取可以找到配置文件的目录。

当然,我可以测试它是否有效,但它不是最好的,它可能在不同的SDL版本中失败,在其他架构上失败,或者谁知道。我想知道它是安全的“按设计”(以及“面向未来”),或者不是。

在SDL-2 wiki上,注意到SDL_ShowSimpleMessageBox()等一些函数,即使在SDL_Init()之前使用它也是安全的,但我不确定这种情况是否属于这种情况。我不确定SDL-2维基是否足够详细以总是显示这样的情况(与SDL_ShowSimpleMessageBox()一样),因为我现在谈论的函数的页面上没有提到这些信息。 / p>

注意,我的应用程序打算在Linux,MacOS和Windows上运行,因此很难自己判断SDL在初始化后将其首选项目放在哪里,还有一个丑陋的冗余内容......

1 个答案:

答案 0 :(得分:3)

也许它对其他人也有用,所以这就是我能想到的:

https://bugzilla.libsdl.org/show_bug.cgi?id=3796

我已经提交了一份关于此问题的SDL bugzilla票证。答案是,它基本上取决于平台,而且不安全,这些函数在没有SDL_Init()的情况下使用。可能在某些平台上工作,可能不在其他平台上(或将来)。但是,我得到了一个提示,在通话中使用SDL_Init(0)SDL_Quit()。所以,添加我自己的想法,就像这样:

char *my_pref_dir_path = NULL;
if (!SDL_Init(0)) {
    char *p = SDL_GetPrefPath(app_org, app_name);
    if (p) {
        my_pref_dir_path = strdup(p);
        SDL_free(p);
    }
    SQL_Quit();
}
if (!my_pref_dir_path) {
    /* ... panic or exit or whatever ... */
}

SDL_Init(0)不会初始化太多(甚至不是视频或其他子系统,因此它不会干扰我以后可能根本不需要SDL的计划),但它现在应该是安全的所需的功能。之后,SQL_Quit()会使SDL“消失”。当然,稍后,有些人可以进行“正确的”SDL初始化,例如:SDL_Init(SDL_INIT_EVERYTHING),就像之前此代码根本没有在您的程序中一样。

因为,我不确定,SDL_GetPrefPath()返回的指针在SQL_Quit()之后是否有效,我会strdup()它等等,我会在SDL_free() SQL_Quit()之前使用SDL_GetPrefPath() 1}}由my_pref_dir_path返回的指针,因为它仍然是文档推荐的。也许我在这里太小心了,但我认为,如果我像这样玩耍,这是一个更安全的赌注。

在此代码之后,a.setContentView(R.layout.dialogedit); 将保留指向SDL首选项目录字符串的指针,如果发生错误,则保留NULL。