代码之家  ›  专栏  ›  技术社区  ›  matt

MSVC++在除以0时出错,这是永远不会发生的!修理

  •  8
  • matt  · 技术社区  · 15 年前
    const int bob = 0;
    
    if(bob)
    {
        int fred = 6/bob;
    }
    

    在进行除法的行上会出现错误: “错误C2124:除零或模零”

    这是站不住脚的,因为“如果”检查将不可避免地失败,因为除法将导致除数为0。坦率地说,我认为编译器甚至没有理由在“if”中计算任何内容,除非是为了确保大括号的完整性。

    无论如何,很明显,这个例子不是我的问题,我的问题出现在做复杂的模板工作时,尽可能多地在编译时进行,在某些情况下,参数可能是0。

    有没有办法修复这个错误?还是禁用它?或者比这更好的解决办法:

    目前,我能想到的唯一解决办法(我以前遇到递归枚举访问的相同问题时也做过)是使用模板专门化来执行“if”。

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

    3 回复  |  直到 15 年前
        1
  •  4
  •   Ferdinand Beyer    15 年前

    我想您的编译器会尝试优化代码段,因为 bob 定义 const ,使 fred 可以在编译时确定。也许可以通过声明bob non const或使用 volatile 关键词。

        2
  •  3
  •   Gary    15 年前

    你能提供更多关于模板的细节吗?也许你可以为0使用一个专门的模板,它与旧的阶乘示例完全不同,完全可以避免错误。

    template <int N>
    struct Blah 
    {
        enum { value = 6 / N };
    };
    
    template <>
    struct Blah<0> 
    {
        enum { value = 0 };
    };
    
        3
  •  3
  •   MSalters    15 年前

    问题是,编译器在这方面别无选择 bob 是一个积分常数表达式,如6。因此6/bob也是冰,而且 必须 在编译时进行评估。

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