for(unsigned int i = 0; i < x.size(); i++)
assert(x[i] > 0);
当没有调试(NDEBUG
标志)时,结果是一个空的for
循环。是否有一种干净的方法来处理这个问题(不执行空for
循环);最好没有预处理器指令,因为它首先会破坏assert
的目的。
答案 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