#define SDL_enabled_assert(condition) \
do { \
while ( !(condition) ) { \
static struct SDL_AssertData sdl_assert_data = { false, 0, #condition, NULL, 0, NULL, NULL }; \
const SDL_AssertState sdl_assert_state = SDL_ReportAssertion(&sdl_assert_data, SDL_FUNCTION, SDL_ASSERT_FILE, SDL_LINE); \
if (sdl_assert_state == SDL_ASSERTION_RETRY) { \
continue; /* go again. */ \
} else if (sdl_assert_state == SDL_ASSERTION_BREAK) { \
SDL_AssertBreakpoint(); \
} \
break; /* not retrying. */ \
} \
} while (SDL_NULL_WHILE_LOOP_CONDITION)
| bool | condition | テストの対象のブール値 |
このマクロはアプリケーションから直接使用することを意図していないが, SDL_assertが有効のとき挿入される.
do {} while(0)は次のような「ぶらさがりelse(dangling-else)」の問題を避けるために存在する:
if (x) SDL_assert(y); else blah();
...do/whileがなければ, "else"はマクロの"if"と結びついてしまう. このマクロでは必要最小限の処理(ループ, 静的変数, ブレイクポイント)のみを行おうとするが, これが高負荷になる場合はSDL_ReportAssertion()を使用すること.
SDL 3.2.0以降