【问题标题】:control may reach end of non-void function xcode控制可能到达非空函数 xcode 的末尾
【发布时间】:2015-06-15 10:58:20
【问题描述】:

我有一个第三方库代码段,其结构如下:

class A;

A func()
{
   if(...)
   {
       return A(...);
   }
   else if(...)
   {
       return A(...);
   }
   else
   {
       LOG(...);
   }

}

它在 Xcode 中给出错误“控制可能到达非无效函数的结尾”。

同一段在 VS2012 中编译没有任何问题。 Xcode c++ 编译器方言和标准库设置为 C++89 和 libstdc++。我知道这是预期的行为,但 vs2012 编译器的行为不符合标准吗?

【问题讨论】:

  • LOG() 宏有什么作用?
  • 您可能设置了将警告变为错误的标志之一。但是您真的希望该代码能够编译吗?
  • 您在else 分支中或函数范围结束之前缺少return

标签: c++ xcode visual-studio-2012


【解决方案1】:

当写类似的东西时

Type func()
{
     ...
}

编译器希望您在函数的每个路径中返回一个Type 类型的对象,这不是您在此处所做的。

或者你的LOG 函数返回一个A 对象,我对此表示怀疑,你应该写return LOG(),或者你的LOG 只是关于日志记录,你应该返回Anull,抛出异常或您需要的任何内容,但不要在不返回任何内容的情况下到达函数的末尾。


我不知道为什么 VS2012 编译,而恕我直言,它不应该,但即使它这样做,也不要编写这样的代码,你稍后会在你的项目中得到一些惊喜。

【讨论】:

    【解决方案2】:

    在这部分函数中

       else
       {
           LOG(...);
       }
    

    尽管函数被声明为具有非 void 的返回类型,但它不会向调用者返回任何内容。

    我不知道,但你应该写

       else
       {
           return LOG(...);
       }
    

    或者用return再添加一条语句

       else
       {
           LOG(...);
           return some_value; 
       }
    

    【讨论】:

      【解决方案3】:

      作为一个转机,我通过在 LOG(...) 之后返回一些虚拟对象解决了这个问题:

      A func()
      {
         if(...)
         {
             return A(...);
         }
         else if(...)
         {
             return A(...);
         }
         else
         {
             LOG(...);
             return A(...);
         }
      
      }
      

      【讨论】:

      • 太好了,我就是这么说的:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 2012-11-12
      • 2014-11-25
      • 2014-05-11
      相关资源
      最近更新 更多