2012-08-15 48 views
28

遇到一些麻煩設置SDL後,我發現SDL定義一個宏替換主:爲什麼SDL定義主宏?

#define main SDL_main 

// And then 
extern C_LINKAGE int SDL_main(int argc, char *argv[]); 

這也可以創建編譯錯誤,如果主函數沒有定義的argcargv參數。

這個宏讓我頭痛,就在我看到它時......爲什麼SDL需要重新定義main?經過一番搜索之後,我發現有些人#undef main,並以正常的方式使用它。

所以這就是問題:爲什麼SDL需要重新定義main,它是幹什麼的?是否有任何副作用來定義它?

我注意到的一件事是,SDL將標準輸出和錯誤重定向到文件(並且我不想要這種行爲),並且如果我取消定義main,則此行爲將停止。

回答

29

the SDL Windows FAQ

您應該使用main()代替WinMain()即使你正在創建一個Windows應用程序,因爲SDL提供的WinMain()一個版本,它調用你的主代碼之前要進行一些初始化SDL。

如果由於某種原因您需要使用WinMain(),請查看src/main/win32/SDL_main.c中的SDL源代碼,以瞭解您的WinMain()函數需要執行哪種初始化操作,以便SDL正常工作。

SDL需要初始化,所以它注入,調用你的「主」的功能,它重命名爲SDL_main,使其不與實際main功能衝突之前運行其初始化自己的main功能。正如在FAQ注意到,您的main函數的形式必須是

int main(int argc, char* argv[]) 
+15

幾乎每個圖書館都需要初始化,但這看起來像是一個糟糕的做法。無論如何。 – 2012-08-15 19:52:14

+12

@DavidGrayson實際上做得很差,特別是如果你有兩個庫這樣做......巨大的痛苦 – 2012-08-15 19:54:29

+0

我可以寫我自己的main()實現,而不是使用這個奇怪的SDL_main()函數嗎?有一些東西(例如,標準輸出重定向),這些東西有點壓倒我的喉嚨,我不想要它。 – Tibi 2012-08-15 20:06:30

5

的雖然我同意,這是一個奇怪的做法,在有些情況下,這是一個合理的解決方案,但它在很大程度上取決於平臺。考慮到不同的平臺有不同的切入點。 Windows通常是WinMain,Linux是主要的,與Android交互發生在Java中,WinRT使用C++/CX擴展,等等。程序入口點和API可以是特定平臺,SDL會盡力爲您解決處理此問題的麻煩。如果您只針對Windows並且SDL僅用於爲您節省使用WIN32 API的麻煩,則可能不需要它。但是,如果你超越桌面,你會發現它在我看來很有用。