52

SDL のセットアップに苦労した後、SDL が main を置き換えるマクロを定義していることに気付きました。

#define main SDL_main

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

argcメイン関数におよびargvパラメータが定義されていない場合、これによりコンパイル エラーが発生することもあります。

このマクロを見ると頭が痛くなります... なぜ SDL は main を再定義する必要があるのですか? さらに検索したところ、何人かの人々が#undef main、通常の方法で使用していることがわかりました。

これが問題です: なぜ SDL は main を再定義する必要があるのでしょうか? それは何をするのでしょうか? それを定義解除することに副作用はありますか?

私が気づいたことの 1 つは、SDL が標準出力とエラーをファイルにリダイレクトすることです (そして、この動作は望ましくありません)。

4

2 に答える 2

54

SDL Windows FAQ によると:

SDL は、メイン コードを呼び出す前に SDL 初期化を実行するバージョンを提供するため、Windows アプリケーションを作成している場合でも、main()代わりにを使用する必要があります。WinMain()WinMain()

何らかの理由で を使用する必要がある場合はWinMain()、 の SDL ソース コードを見て、SDL が適切に機能するために関数src/main/win32/SDL_main.cでどのような初期化を行う必要があるかを確認してください。WinMain()

SDL は初期化を必要とするため、実際の関数と競合しないようmainに名前を変更する「メイン」関数を呼び出す前に、初期化を実行する独自の関数を挿入します。FAQ に記載されているように、関数は次の形式でなければなりませんSDL_mainmainmain

int main(int argc, char* argv[])
于 2012-08-15T19:49:18.823 に答える
12

これが奇妙な慣習であることには同意しますが、プラットフォームによって大きく異なりますが、これが妥当な解決策である場合もあります。異なるプラットフォームには異なるエントリ ポイントがあることを考慮してください。通常、Windows は WinMain、Linux はメイン、Android との対話は Java で行われ、WinRT は C++/CX 拡張機能を使用するなどです。プログラムのエントリ ポイントと API はプラットフォーム固有のものである可能性があり、SDL はこれに対処する手間を省こうとします。Windows のみを対象としていて、SDL が WIN32 API を使用する手間を省くためだけにある場合は、SDL は必要ないかもしれません。しかし、デスクトップを超えたことがあれば、私の意見では便利だと思います。

于 2015-10-10T07:31:36.247 に答える