【问题标题】:no return, in function returning non-void {in eclipse CDT}不返回,在函数中返回非 void {在 eclipse CDT 中}
【发布时间】:2016-11-26 22:30:56
【问题描述】:
Save=0;
bool checking() const; ///declaration

inline bool isZombie() const  //definition
{ if(Save==0)   {return cc_t < 0}
  if(Save==1)  {return cc_i < 0;}
}

这是一个非常幼稚的问题。我理解代码中错误的含义。谁能告诉我,为什么它不接受有条件的退货声明。 如果我把上面的代码写成

bool checking() const  //definition
{ if(Save==0)   {return cc_t < 0}
  else {return cc_i < 0;}
}

那么,没有警告..?

【问题讨论】:

  • “保存”的类型是什么?
  • 只是因为这样return 语句可能永远达不到
  • 您的代码缺少;,否则如果一个坏主意是合法的。警告是因为如果 save 为 3,您的代码将执行未定义的行为。
  • Save 大于等于2 时,isZombie 函数会发生什么情况?

标签: c++ eclipse c++11 eclipse-cdt


【解决方案1】:

Save 实际上是什么类型?您在其余可能的分支中缺少 return 语句。这个警告有什么不清楚的地方?

inline bool isZombie() const  //definition
{ if(Save==0)   {return cc_t < 0;}
                             // ^ Supposed this is a typo
  if(Save==1)  {return cc_i < 0;}
  return false; // <<<<<<<<<<<<<<<<<<<<<<<<<<<
}

【讨论】:

  • 即使 Save 是一个布尔值,如果 eclipse 错过了逻辑,我也不会感到震惊。
  • πάντα ῥεῖ 的示例允许您的 if 被处理两次(这通常是糟糕的设计);从功能上讲,它返回第一个、第二个或默认为 false。默认为 false 是这里的关键。
  • @JohanLundberg 你真的相信这是 Eclipse-CDT 的问题吗?
  • @πάνταῥεῖ,我只是在推测:如果 Savebool,我不希望 clang 或 gcc 对显示的代码发出警告。
  • @JohanLundberg 没错,这将是使用的工具链的问题,而不是 Eclipse CTD,除非提到了智能感知。
【解决方案2】:

一般来说,最好有一个确定的返回路径。

例如,一个可以将其写成(并保持您的代码大部分不变):

inline bool isZombie() const { 
   if(Save==0)
      return cc_t < 0;
  else
       return cc_i < 0;
}

或者,或者:

inline bool isZombie() const { 
  bool rVal = (cc_i < 0); 
  if(Save==0)
     return cc_t < 0;
  return rVal;
}

【讨论】:

  • return ((Save == 0) ? cc_t : cc_i) &lt; 0;
  • 确实,但我想以他目前的格式保留和易于追踪的逻辑。对于某些人来说,可读性会产生更好的理解。并不是说您的建议不再正确,这取决于他的 C++ 暴露程度,这可能更难在心理上解析。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 2020-10-03
相关资源
最近更新 更多