警告:“并非所有控制路径都返回值”c ++

时间:2017-06-15 12:42:20

标签: c++ compiler-warnings

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

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

如果有人可以帮助我?

6 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

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

你能做的是 -

  1. 忽略警告 - 您可以忽略警告并继续前进。但是要小心,在所有情况下你只能输入1 o 2作为参数。
  2.   

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

    1. 添加默认 - 此条件实际上不会执行,但编译器现在将停止发出警告。
    2. 以下是更正后的代码 -

      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
      
      <select id="foo">
        <option>Notification</option>
        <option>Other</option>
      </select>
      
      <input type="text" id="new-option" required>
      <button type="button" id="add">Add Option</button>

      或者你可以这样做 -

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果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 - 路径:

修复此问题
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 :(得分:0)

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

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

答案 5 :(得分:-1)

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