5
for(unsigned int i = 0; i < x.size(); i++)
    assert(x[i] > 0);

デバッグしない場合 (NDEBUGフラグ)、結果は空のforループになります。これを処理するクリーンな方法はありますか (空のforループを実行しないでください); assertそもそもの目的を無効にするため、できればプリプロセッサ ディレクティブを使用しないでください。

4

3 に答える 3

7
inline bool all_positive(std::vector<int> const &x)
{
    for (size_t i = 0; i < x.size(); i++)
        if (x[i] <= 0)
            return false;
    return true;
}

それから

assert(all_positive(x));

(ただし、 が定義されていると、「未使用の関数」という警告が表示される場合NDEBUGがあります)。

于 2013-01-30T16:27:59.437 に答える
5

優れたオプティマイザーは、 が定義されているときにループ全体を排除できるはずNDEBUGです (私はちょうど私のものをテストしましたが、そうしています)。

#ifndef NDEBUGまたは、ループ全体を/で囲むこともできます#endif。あなたはこれを「assertそもそもの目的を破るだろう」と言いますが、私はその理屈にはあまり従いません。

于 2013-01-30T16:26:12.297 に答える
4

assertNDEBUGが定義されている場合、ステートメントはノーオペレーションになります。ループ全体で同様のことを行うには、次のようにします。

#ifndef NDEBUG
for(unsigned int i = 0; i < x.size(); i++)
    assert(x[i] > 0);
#endif
于 2013-01-30T16:28:14.097 に答える