SDL_GetBasePath() 和 SDL_GetPrefPath() 可以在 SDL_Init() 之前调用吗?
Can SDL_GetBasePath() and SDL_GetPrefPath() be called before SDL_Init()?
在我的应用程序中,我想使用一个配置文件。但是我这里有先有鸡还是先有蛋的问题:配置文件甚至可以描述应该如何初始化 SDL(和其他东西)。因此,我什至需要在 SDL_Init()
之前调用 SDL_GetPrefPath()
以获得以每个用户为基础存储我的应用程序配置的公共位置。我不确定这是否可能。我还需要 SDL_GetBasePath()
用于类似(回退)目的,我知道这很丑陋,但有些用户希望有选择地尝试查找配置文件。读取配置文件本身不是问题,因为我没有为此使用 SDL 相关函数,尽管我需要获取可以找到配置文件的目录。
当然,我可以测试它是否有效,但它不是最好的,它可能会在不同的 SDL 版本、其他架构或谁知道的情况下失败。我想知道它是否安全 "by design"(和 "future-proof")。
在 SDL-2 wiki 上,一些像 SDL_ShowSimpleMessageBox()
的函数被指出,即使在 SDL_Init()
之前也可以安全使用,但我不确定在这种情况下是否属于这种情况.我不确定 SDL-2 wiki 是否足够详细以始终显示这种情况(与 SDL_ShowSimpleMessageBox()
一样),因为我现在正在谈论的功能页面上没有提到这些信息。
请注意,我的应用程序打算在 Linux、MacOS 和 Windows 上 运行,因此我自己很难判断 SDL 在初始化后将其首选项目录放在哪里,然后还有一个丑陋的,多余的东西......
也许它对其他人也有用,所以这是我能弄清楚的:
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)
不会初始化太多(连video或者其他子系统也不行,所以不会干扰我以后可能根本不需要SDL的计划),不过现在应该是安全的使用所需的功能。之后,SQL_Quit()
将使 SDL "go away"。后面当然可以有一个"proper" SDL初始化,例如:SDL_Init(SDL_INIT_EVERYTHING)
,就好像这段代码之前根本没有在你的程序中一样。
因为,我不确定,如果 SDL_GetPrefPath()
返回的指针在 SQL_Quit()
之后有效,我会 strdup()
之类的,我使用 SDL_free()
在 SDL_GetPrefPath()
返回的指针上的 SQL_Quit()
之前,因为它也是文档推荐的。也许我在这里太小心了,但我认为,如果我这样玩花样,那是一个更安全的赌注。
在此代码之后,my_pref_dir_path
将保存指向 SDL 首选项目录字符串的指针,如果发生错误,则为 NULL。
在我的应用程序中,我想使用一个配置文件。但是我这里有先有鸡还是先有蛋的问题:配置文件甚至可以描述应该如何初始化 SDL(和其他东西)。因此,我什至需要在 SDL_Init()
之前调用 SDL_GetPrefPath()
以获得以每个用户为基础存储我的应用程序配置的公共位置。我不确定这是否可能。我还需要 SDL_GetBasePath()
用于类似(回退)目的,我知道这很丑陋,但有些用户希望有选择地尝试查找配置文件。读取配置文件本身不是问题,因为我没有为此使用 SDL 相关函数,尽管我需要获取可以找到配置文件的目录。
当然,我可以测试它是否有效,但它不是最好的,它可能会在不同的 SDL 版本、其他架构或谁知道的情况下失败。我想知道它是否安全 "by design"(和 "future-proof")。
在 SDL-2 wiki 上,一些像 SDL_ShowSimpleMessageBox()
的函数被指出,即使在 SDL_Init()
之前也可以安全使用,但我不确定在这种情况下是否属于这种情况.我不确定 SDL-2 wiki 是否足够详细以始终显示这种情况(与 SDL_ShowSimpleMessageBox()
一样),因为我现在正在谈论的功能页面上没有提到这些信息。
请注意,我的应用程序打算在 Linux、MacOS 和 Windows 上 运行,因此我自己很难判断 SDL 在初始化后将其首选项目录放在哪里,然后还有一个丑陋的,多余的东西......
也许它对其他人也有用,所以这是我能弄清楚的:
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)
不会初始化太多(连video或者其他子系统也不行,所以不会干扰我以后可能根本不需要SDL的计划),不过现在应该是安全的使用所需的功能。之后,SQL_Quit()
将使 SDL "go away"。后面当然可以有一个"proper" SDL初始化,例如:SDL_Init(SDL_INIT_EVERYTHING)
,就好像这段代码之前根本没有在你的程序中一样。
因为,我不确定,如果 SDL_GetPrefPath()
返回的指针在 SQL_Quit()
之后有效,我会 strdup()
之类的,我使用 SDL_free()
在 SDL_GetPrefPath()
返回的指针上的 SQL_Quit()
之前,因为它也是文档推荐的。也许我在这里太小心了,但我认为,如果我这样玩花样,那是一个更安全的赌注。
在此代码之后,my_pref_dir_path
将保存指向 SDL 首选项目录字符串的指针,如果发生错误,则为 NULL。