调用将在程序的Release ver中删除调用assert的函数?

时间:2010-11-26 12:31:32

标签: c++ refactoring assert

如果我有类似的话:

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)检查,因为如果它们将在最终版本中删除,那么断言的好处是什么。你觉得怎么样?

3 个答案:

答案 0 :(得分:1)

是的,assert不会进入发布版本,但对Assert函数的调用仍将保留。充其量,您的编译器可能会检测到一个空函数并禁止调用,但我不会指望它。如果确实想从发布版本中删除这些调用,则可以使用#ifdef / #endif来覆盖这些调用。

关于断言的好处,这显然是“主观和议论性的”,所以我会通过!

答案 1 :(得分:1)

您应该始终将错误检查与断言相结合。否则你在释放模式下什么都得不到,因为所有稳定性代码都将消失。所以如果我是你,我会在if语句中加入,以防止出现在您的函数中的错误或无效数据。

至于你的'空'函数是否会被编译器删除,或者在发布版本中没有,我想这取决于编译器。但我不会将断言作为确定输入数据是否有效的唯一机制。我会坚持使用if语句来防范它。因此它有点成为一个有争议的问题。

答案 2 :(得分:0)

我想这取决于你的编译器是否优化了一个空函数调用(因为所有assert都会消失)。