除以0的MSVC ++错误,永远不会发生!固定?

时间:2010-06-21 06:26:16

标签: c++ visual-c++ compiler-construction

const int bob = 0;

if(bob)
{
    int fred = 6/bob;
}

您将在完成除法的行上收到错误: “错误C2124:除以或模零”

这是蹩脚的,因为'if'检查失败是不可避免的,因为除法将导致div为0.坦率地说,我认为编译器甚至无法评估任何内容'if',除了确保支撑完整性。

无论如何,显然这个例子不是我的问题,我的问题来自于做复杂的模板尝试在编译时尽可能多地做,在某些情况下参数可能是0。

无论如何都要修复此错误?或禁用它?或者比这更好的解决方法:

目前我能想到的唯一一项工作(我之前遇到过与递归枚举访问相同的问题)是使用模板特化来执行'if'。

哦,是的,我正在使用Visual Studio Professional 2005 SP1和vista / win7修复程序。

3 个答案:

答案 0 :(得分:4)

我想您的编译器会尝试优化代码片段,因为bob已定义为const,因此可以在编译时确定fred的初始值。也许你可以通过声明bob non-const或使用volatile关键字来阻止这种优化。

答案 1 :(得分:3)

您能否提供有关您尝试使用模板的更多详细信息?也许你可以使用0的专用模板,它在旧的Factorial示例中没有任何作用,并且完全避免错误。

template <int N>
struct Blah 
{
    enum { value = 6 / N };
};

template <>
struct Blah<0> 
{
    enum { value = 0 };
};

答案 2 :(得分:3)

问题 - 编译器在此没有选择 - 是bob是一个积分常量表达式,因为6。因此6 / bob也是一个ICE,必须在编译时进行评估。

有一个非常简单的解决方案:inline int FredFromBob(int bob) { return 6/bob; } - 函数调用表达式永远不是ICE,即使函数是微不足道的并且是内联声明的。