今日、アサーション関数のいくつかがまだ存在し、リリース ビルドで呼び出されていることを発見しました。これが私のアサーション関数の例です。
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 属性など) も問題ありません。