2016-09-04 7 views
0

システムウィンドウマネージャとインターフェイスするSDLソースコードをブラウズしているときに、struct SDL_VideoDeviceに奇妙なUint8 window_magicフィールドが発生しました。この分野のドキュメントはないようです。この分野の目的は何ですか?以下の関数/マクロ(すべてSDL_video.cで定義されています)で役割を果たします。SDLのwindow_magicのポイントは何ですか?

マクロCHECK_WINDOW_MAGIC

#define CHECK_WINDOW_MAGIC(window, retval) \ 
    if (!_this) { \ 
     SDL_UninitializedVideo(); \ 
     return retval; \ 
    } \ 
    if (!window || window->magic != &_this->window_magic) { \ 
     SDL_SetError("Invalid window"); \ 
     return retval; \ 
    } 

機能SDL_GetWindowWMInfo

SDL_GetWindowWMInfo(SDL_Window * window, struct SDL_SysWMinfo *info) 
{ 
    CHECK_WINDOW_MAGIC(window, SDL_FALSE); 

    if (!info) { 
     SDL_InvalidParamError("info"); 
     return SDL_FALSE; 
    } 
    info->subsystem = SDL_SYSWM_UNKNOWN; 

    if (!_this->GetWindowWMInfo) { 
     SDL_Unsupported(); 
     return SDL_FALSE; 
    } 
    return (_this->GetWindowWMInfo(_this, window, info)); 
} 

機能SDL_CreateWindow

SDL_Window * 
SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags) 
{ 
    ... 
    window->magic = &_this->window_magic; 
    ... 
} 

_thisが初期化されるSDL_VideoDevice、へのポインタでありますユーザCA lls SDL_Init。ユーザーがSDL_CreateWindowを呼び出すと、SDLはのアドレスにwindow->magicを割り当てます。私が知る限り、_this->window_magicは決してSDLのどこにでも初期化されていません。おそらくこの価値の役割は何か?

+0

関連性があるかどうかわからないが、魔法を理解しているとわかっているから、どうやって説明できるのかわからないコードを説明するのに魔法が使用されているhttps://www.google.com/search?q=magic+more +魔法 – Slai

答えて

0

アドレスは_this->window_magicで、値は使用していません。特に構造体フィールドの場合、変数にアドレスを持たせるために初期化する必要はありません。

この目的は、初期化されていないウィンドウを確認するか、まったくウィンドウをチェックしないことです。保証はありませんが、ヒット率は非常に高く、SDLの内部構造のアドレスが誤って一致することはほとんどありません。

関連する問題