2017-09-04 54 views
3

在我的應用程序中,我想使用配置文件。然而,我在這裏有雞和雞蛋的問題:配置文件甚至可以描述如何啓動SDL(和其他事物)。因此,我需要調用SDL_GetPrefPath()之前甚至SDL_Init()讓那裏爲我的應用配置存儲爲每個用戶爲基礎的共同的地方。我不確定是否有可能。我也需要SDL_GetBasePath()來達到類似(後退)的目的,我知道這很醜陋,但有些用戶希望可以選擇試圖找到配置文件。讀配置文件本身不是問題,因爲我不使用SDL相關函數,但我需要獲取可找到配置文件的目錄。可以在SDL_Init()之前調用SDL_GetBasePath()和SDL_GetPrefPath()嗎?

當然,我可以測試,如果它的工作,但它不是最好的,它可能無法在不同版本的SDL,對其他建築,或誰知道。我想知道這是安全的「設計」(和「面向未來」),或不。

在SDL-2維基上,記錄了一些功能,如SDL_ShowSimpleMessageBox(),即使在SDL_Init()之前使用它也是安全的,但我不確定這是否是這種情況。我不知道如果SDL-2 Wiki是不夠詳細,始終顯示這樣的情況(如SDL_ShowSimpleMessageBox()),因爲對我說的是現在的功能頁面沒有提及此信息。

請注意,我的應用程序打算在Linux,MacOS和Windows上運行,所以很難自行判斷SDL在初始化後會放置它的首選目錄,還有一個醜陋的,冗餘的東西......

+0

沒有看到任何東西-SDL_Init()依賴於[源](http://hg.libsdl.org/SDL/file/f76299105635/src/filesystem)(鑑於[Wiki](https) ://wiki.libsdl.org/SDL_Init)聲稱記錄系統不需要INITING),可以嘗試戳[郵件列表](HTTPS://discourse.libsdl。org/c/sdl-development),並可能向[Bugzilla](https://bugzilla.libsdl.org/)添加文檔說明請求。 – genpfault

+0

是的,我也嘗試着看源代碼。我也在想,也許我的解決方案存在缺陷。雖然我不確定如何解決這個問題,但這並不取決於SDL_Init()之前可以完成的「希望」,而SDL_Init()將來可能會作爲一個應該依賴的未解釋行爲而改變。也許SDL_Init(0);或者類似的東西,讓我們稍後在配置讀取後初始化子系統?目前我沒有太多想法,但我希望一些有經驗的SDL用戶可能在這裏有一個好主意。或者郵件列表,的確如此:D –

+0

我認爲郵件列表是你最好的選擇,這個*應該*「只是」是一個文檔問題,我認爲你有一個引人注目的用例。 – genpfault

回答

1

也許這是對別人太有用了,所以這是我能想出:

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()返回的指針之前,因爲它是由文檔建議也無妨。也許我在這裏過於謹慎,但我認爲,如果我玩這樣的技巧,那麼這是一個更安全的選擇。

此代碼後,my_pref_dir_path將舉行的指針SDL喜好目錄字符串或NULL,如果發生錯誤。

相關問題