目次 - API(機能別) - 初期化と終了 - SDL_Init

# SDL_Init

SDLライブラリを初期化する. 他のあらゆるSDLの関数を呼び出す前にこの関数を呼ぶ必要がある.

## 構文

`int SDL_Init(Uint32 flags)`

## 引数

flags | サブシステム初期化フラグ

## 戻り値

成功のとき0, エラーのとき負の数のエラーコードを戻す. SDL_GetError()を呼んで詳細を知ることができる.

## サンプルコード

### C

``

    #include "SDL.h"
    #include <stdio.h> /* fprintf()のため */
    #include <stdlib.h> /* atexit()のため */

    int main(int argv, char** argc) {
        if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0) {
            fprintf(stderr,
                    "\nSDLを初期化できなかった:  %s\n",
                    SDL_GetError()
                   );
            return 1;
        }
        atexit(SDL_Quit);

        /* ... */

        return 0;
    }

### C++

``

    #include <exception>
    #include <string>
    #include "SDL.h"

    class InitError: public std::exception {
        public:
            InitError();
            InitError(const std::string&);
            virtual ~InitError() throw();
            virtual const char* what() const throw();
        private:
            std::string msg;
    };

    InitError::InitError():
      exception(), msg(SDL_GetError()) {}
    InitError::InitError(const std::string& m):
      exception(), msg(m) {}
    InitError::~InitError() throw() {}
    const char* InitError::what() const throw() {
        return msg.c_str();
    }

    class SDL {
        public:
            SDL(Uint32 flags = 0) throw(InitError);
            virtual ~SDL();
    };

    SDL::SDL(Uint32 flags) throw(InitError) {
        if (SDL_Init(flags) != 0)
            throw InitError();
    }

    SDL::~SDL() {
        SDL_Quit();
    }

    /* ... */

    #include <iostream>

    int main(int argc, char **argv) {
        try {
            SDL sdl(SDL_INIT_VIDEO|SDL_INIT_TIMER);

            /* ... */

            return 0;
        }

        catch (const InitError& err) {
            std::cerr
                << "SDLの初期化中にエラーが発生した:  "
                << err.what() << std::endl;
        }

        return 1;
    }

## 詳細

SDL_Init()は単純にSDL_InitSubSystem()に処理を渡している. よって, これら2つは入れ替えられる. コードが読みやすさを考慮するならば, SDL_InitSubSystem()の方がよいかもしれない.

ファイルI/O, そしてスレッドサブシステムはデフォルトで初期化される. 他のサブシステムを使うときは指定して初期化しなければならない.

flagsは以下の項目の論理和で複数設定できる:

SDL_INIT_TIMER | タイマ サブシステム
SDL_INIT_AUDIO | オーディオ サブシステム
SDL_INIT_VIDEO | ビデオ サブシステム. 自動的にSDL_INIT_EVENTSサブシステムを初期化する
SDL_INIT_JOYSTICK | ジョイスティック サブシステム
SDL_INIT_HAPTIC | ハプティクス(感覚フィードバック) サブシステム
SDL_INIT_GAMECONTROLLER | コントローラー サブシステム. 自動的にSDL_INIT_JOYSTICKサブシステムを初期化する
SDL_INIT_EVENTS | イベント サブシステム
SDL_INIT_EVERYTHING | 上記のサブシステムの全て
SDL_INIT_NOPARACHUTE | 互換性のために存在する. このフラグは機能しない

個別にサブシステムを初期化したい場合は, SDL_Init(0)を呼び, 後で必要なflagsを指定してSDL_InitSubSystem()を呼ぶとよい.

## 関連項目(関数)

SDL_InitSubSystem
SDL_Quit
SDL_SetMainReady
SDL_WasInit

## SDL Wikiへのリンク

SDL_Init - SDL Wiki