【问题标题】:Warning : "Not all control paths return a value" c++警告:“并非所有控制路径都返回值”c++
【发布时间】:2017-06-15 12:42:20
【问题描述】:

对于我的小功能,我不明白这个警告:

int Fct_name (int nb1, int * nb2) 
{
    switch (Dest)
    { 
    Case 1 : 
        return Fct_1(nb1,nb2);
    Case 2 :
        return -1;
    }
}

如果有人可以帮助我?

【问题讨论】:

标签: c++ compiler-warnings


【解决方案1】:

这是因为,正如警告所说,并非代码的所有路径都返回一个值,而函数具有不同的返回类型,它告诉编译器“嘿,我要返回一些东西”。但如果 Dest 不是 1 或 2,您实际上不会这样做。


你评论过:

Dest 只能是 1 或 2(它是一个枚举)

是的,但是只有你知道,你的编译器不知道,它不会相信你的话。它只能看到代码的静态属性,无法预测运行时将如何运行,因此它不会接受您的代码。据它所知,Dest 可以通过外部代码等进行更改。


你应该添加一些默认值:

int Fct_name (int nb1, int * nb2) 
{
   switch (Dest)
   { 
    case 1 : 
         return Fct_1(nb1,nb2);
    case 2 :
         return -1;
    }
    return 0;
}

【讨论】:

  • 哦,好吧..我以为编译器会知道 Dest 只能是 1 或 2 .. 谢谢大家的回答!
  • @Gill Bates:如果Dest 是一个枚举,那么编译器就会知道,因为所有其他值都是无效的(我想是陷阱表示?)。
  • @Guigui 编译器可能知道,我们不知道Dest 是什么类型。
【解决方案2】:

如果dest 是一个只有两个值的枚举,就没有必要复杂了——return Dest == 1 ? Fct_1(nb1,nb2) : -1; 就足够了。 否则,将case 2: 替换为default:

【讨论】:

    【解决方案3】:

    如果 Dest 真的是你所说的枚举,编译器不应该在你的情况下发出警告。至少我的编译器没有。所以下面的代码编译没有警告/错误:

    enum {
      x = 1,
        y = 2
    } Dest;
    
    int Fct_name (int nb1, int * nb2)
    {
        switch (Dest)
        {
                case 1 :
                return -5; //Fct_1(nb1,nb2);
                case 2 :
                return -1;
        }
    }
    
    int main() {
    
    }
    

    但是,如果Dest 是一个整数,或者如果枚举定义了除12 之外的其他值,那么我也会收到错误消息。然后可以使用default-path:

    修复此问题
    enum {
      x = 1,
        y = 2,
        z = 3
    } Dest;
    
    int Fct_name (int nb1, int * nb2)
    {
        switch (Dest)
        {
                case 1 :
                return -5; //Fct_1(nb1,nb2);
                case 2 :
                return -1;
            default:
                return 0;
        }
    }
    

    【讨论】:

      【解决方案4】:

      正如@NathanOliver 所说,警告意味着可能存在您的函数可能不返回任何值的情况。更准确地说,如果用户输入的值不是 1 或 2,那么您的函数不会返回任何值。

      您可能认为您只输入 1 或 2。但编译器不知道这一点。

      你能做的是——

      1. 忽略警告 - 您可以忽略警告并继续操作。但请注意,在所有情况下都只将 1 o 2 作为参数。

      虽然我不建议忽略警告。一般来说,最好注意警告。从长远来看,如果您正在处理大型项目,它可以帮助您避免许多错误。

      1. 添加默认值 - 此条件实际上永远不会执行,但编译器现在将停止发出警告。

      这是更正后的代码 -

      int Fct_name (int nb1, int * nb2) 
          {
              switch (Dest)
              { 
                 case 1 : 
                    return Fct_1(nb1,nb2);
                 case 2 :
                    return -1;
                 default:
                   return 0;
             }
         }
      

      或者你可以这样做 -

      int Fct_name (int nb1, int * nb2) 
      {
          switch (Dest)
          { 
             case 1 : 
                return Fct_1(nb1,nb2);
             case 2 :
                return -1;
          }
          return 0;
      }
      

      【讨论】:

      • 不要忽略警告。更改代码以删除警告很简单。
      【解决方案5】:

      如果 Dest 只能是 1 或 2,你可以这样重写

      int Fct_name (int nb1, int * nb2) 
      {
          if(Dest == 1) return Fct_1(nb1,nb2);
          return -1;
      }
      

      【讨论】:

        【解决方案6】:

        在函数末尾添加一个 return XXX,这将确保编译器不会在没有返回值的情况下到达函数末尾。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-12-06
          • 1970-01-01
          • 2013-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多