`assert` in循环

时间:2013-01-30 16:21:40

标签: c++ loops optimization assert

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

当没有调试(NDEBUG标志)时,结果是一个空的for循环。是否有一种干净的方法来处理这个问题(不执行空for循环);最好没有预处理器指令,因为它首先会破坏assert的目的。

3 个答案:

答案 0 :(得分:6)

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时可能会出现“未使用的功能”警告。)

答案 1 :(得分:4)

一个好的优化器应该能够在定义NDEBUG时消除整个循环(我刚刚测试过我的,并且确实这样做了。)

或者,您可以使用#ifndef NDEBUG / #endif围绕整个循环。你说这“首先会打败assert的目的”,但我并没有真正遵循这个推理。

答案 2 :(得分:3)

如果定义assert

NDEBUG语句将变为无操作。要为整个循环做类似的事情,你可以做

#ifndef NDEBUG
for(unsigned int i = 0; i < x.size(); i++)
    assert(x[i] > 0);
#endif