0

Cで次のようなことをしたい:

doSomthing(test_arg1); // first time
check_if_everything_good();

doSomething(test_arg2); // second time
check_if_everything_good();

doSomething(test_arg3); // third time
check_if_everything_good();

アイデアは、doSomething() を呼び出した後、check_if_everything_good() を呼び出して、関数呼び出しが他のものを破損していないことを確認したいということです。doSomething() が何かを壊した場合、check_if_everything_good() は 2 回目の doSomething() 呼び出しの前に戻ります。

ただし、doSomething() の後に毎回 check_if_everything_good() を呼び出すことは避けたい {check_if_everything_good は高価です}。Cでこれを効率的に達成する方法はありますか? Javaのtry/catchのようなものかもしれません

4

3 に答える 3

1

開発環境でのデバッグ/診断目的でのみ必要であると仮定するとcheck_if_everything_good、次のようなことができます。

#ifndef NDEBUG
#define check_if_everything_good() do_check_if_everything_good()
#else
#define check_if_everything_good()
#endif

NDEBUG通常、「リリース」(または「デバッグではない」)ビルドでコンパイラによって定義される定義であるため、ここでは「実際に意味がある場合にのみこれを行う」ために使用します。

于 2013-07-09T23:32:37.427 に答える
1

セットジャンプと走り幅跳びが使える

これを読んでください http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html

また、goto ステートメントを使用することもできます

http://www.roseindia.net/c-tutorials/c-goto-statement.shtml

于 2013-07-10T10:14:42.200 に答える
0

実稼働コードのチェックをコンパイルできるようにすることが必要な場合は、Mats の提案がうまく機能します。独自のマクロを作成しない同等の解決策は、失敗の場合は 0 を返し、成功の場合はゼロ以外を返すようにチェック関数を変更し、呼び出しをassert().

assert(check_if_everything_good());

パフォーマンスに影響するため、常にではなく時々チェックを実行する場合は、ランダム サンプリングを使用できます。この場合、単に を呼び出しrand()、戻り値がある範囲内にある場合はチェックを実行し、そうでない場合はチェックをスキップすることを意味します。

#define maybe_check_everything() \
    do { \
        if (CHECK_ALWAYS || (CHECK_THRESHOLD ? rand() < CHECK_THRESHOLD : 0)) \
            check_if_everything_good(); \
    } while (0)
于 2013-07-10T09:58:02.073 に答える