0

今日、アサーション関数のいくつかがまだ存在し、リリース ビルドで呼び出されていることを発見しました。これが私のアサーション関数の例です。

bool const isDebugMode()
{
    return false;  // Will be controlled by preprocessor flag.
}
void assertWithReason(bool const condition, std::string const reason = "")
{
    if (isDebugMode() and not condition)
    {
        abort();
    }
}

条件式の副作用がアサーション呼び出しの排除を妨げていると思います。

例えば、

assertWithReason(glGetError() == GL_NO_ERROR);

このアサーション コールが排除されることを期待していましたが、そうではありません。debug-buildをチェックする前に実行されているためです。

C++ がこのケースをどのように処理するかはわかりませんが、C++ は非常に厳密な言語であるため、特別なフラグを立てない限り排除されないようです。とにかく、私は意図的にリリース ビルドで削除されるアサーションを書きました。

リリースビルドで確実に削除される関数を C++ で書くことは可能ですか? もちろんプリプロセッサマクロも使えますが、プリプロセッサマクロは極力使わないようにしたいです。

私は Clang を使用しており、コンパイラ固有の拡張機能 (GCC 属性など) も問題ありません。

4

2 に答える 2

2

私はこの目的のためにマクロを使用するのが好きです。はい、知っています。マクロはですが、ナイフ (間違った使い方) が悪であるのと同じように、正しく使えば便利です。

 #define MY_ASSERT(x) do {\
       if (is_debug() && !x) assertFailed(__FILE__, __LINE__, __FUNCTION__, #x);\
     } while(0);

これで、失敗した場所 (my_drawfunc.cpp: 34 : my_do_draw(): assertion failed: glGetError == GL_NO_ERRORまたはそのようなもの) を表示することもできます。

于 2013-07-25T11:49:13.620 に答える