如果我有类似的话:
static long double calcFactor_(const short mantissa, const short exponent,const short base = Derived::internals_.base_)
{
assert(mantissa > 0);
assert(mantissa < NumericLimits<short>::max);
assert(exponent < NumericLimits<short>::max);
assert(exponent > NumericLimits<short>::min);
assert(base < NumericLimits<short>::max);
assert(base > NumericLimits<short>::min);
return mantissa * ::pow(static_cast<long double>(base),exponent);
}
并且在我的程序的其他地方我也使用那些相同的调用断言,所以我想将它从这个fnc主体移到单独的fnc并且只在我拥有那些的地方调用这个fnc现在要求资产。但如果我错了,请纠正我:对于断言的调用将在发布版本中删除,但如果我有:
void Assert (//neccesary args here)
{
assert(mantissa > 0);
assert(mantissa < NumericLimits<short>::max);
assert(exponent < NumericLimits<short>::max);
assert(exponent > NumericLimits<short>::min);
assert(base < NumericLimits<short>::max);
assert(base > NumericLimits<short>::min);
}
是否会调用此fnc也会从发布版本中删除?而另一个Q我认为这里不应该断言我应该有if(!condition)检查,因为如果它们将在最终版本中删除,那么断言的好处是什么。你觉得怎么样?
答案 0 :(得分:1)
是的,assert
不会进入发布版本,但对Assert
函数的调用仍将保留。充其量,您的编译器可能会检测到一个空函数并禁止调用,但我不会指望它。如果确实想从发布版本中删除这些调用,则可以使用#ifdef
/ #endif
来覆盖这些调用。
关于断言的好处,这显然是“主观和议论性的”,所以我会通过!
答案 1 :(得分:1)
您应该始终将错误检查与断言相结合。否则你在释放模式下什么都得不到,因为所有稳定性代码都将消失。所以如果我是你,我会在if语句中加入,以防止出现在您的函数中的错误或无效数据。
至于你的'空'函数是否会被编译器删除,或者在发布版本中没有,我想这取决于编译器。但我不会将断言作为确定输入数据是否有效的唯一机制。我会坚持使用if语句来防范它。因此它有点成为一个有争议的问题。
答案 2 :(得分:0)
我想这取决于你的编译器是否优化了一个空函数调用(因为所有assert
都会消失)。