gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:23:59 28 4
gpt4 key购买 nike

在我的应用程序中,我想使用配置文件。然而,我在这里遇到先有鸡还是先有蛋的问题:配置文件甚至可以描述应该如何初始化 SDL(和其他东西)。因此,我需要在 SDL_Init() 之前调用 SDL_GetPrefPath() 来获取按用户存储应用程序配置的公共(public)位置。我不确定是否可能。我还需要 SDL_GetBasePath() 来实现类似的(后备)目的,我知道这很丑陋,但有些用户可能会喜欢尝试查找配置文件。读取配置文件本身不是问题,因为我不使用SDL相关函数,尽管我需要获取配置文件所在的目录。

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

在 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) 不会初始化太多(甚至不会初始化视频或其他子系统,因此不会干扰我以后可能根本不需要 SDL 的计划),但它现在应该可以安全地使用所需的功能了。之后,SQL_Quit() 将使 SDL“消失”。当然,稍后您可以进行“适当的”SDL 初始化,例如:SDL_Init(SDL_INIT_EVERYTHING),就像此代码以前根本没有出现在您的程序中一样。

因为,我不确定 SDL_GetPrefPath() 返回的指针在 SQL_Quit() 之后是否有效,我会 strdup() > 它或类似的,并且我在 SDL_GetPrefPath() 返回的指针上的 SQL_Quit() 之前使用 SDL_free(),因为文档建议这样做无论如何也是。也许我在这里太小心了,但我想,如果我玩这样的把戏,那就更安全了。

在此代码之后,my_pref_dir_path 将保存一个指向 SDL 首选项目录字符串的指针,如果发生错误,则为 NULL。

关于sdl - 可以在 SDL_Init() 之前调用 SDL_GetBasePath() 和 SDL_GetPrefPath() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46039802/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com