簡體   English   中英

為什么編譯器聲稱此類方法沒有返回值?

[英]Why does the compiler claim this class method has no return value?

我從Eclipse中得到的錯誤是“無返回,函數返回非空”。 我添加了默認值:case以查看是否可以消除錯誤,但是沒有bean。 我認為可以返回右值,因為它會按值復制到堆棧上,因此當getLogLevelName()的局部變量超出范圍時,將存在字符串的副本。 確實,調用代碼可以工作,但是錯誤對我來說卻是神秘的。

std::string bmd2::Logger::getLogLevelName(bmd2::Logger::LogLevel logLevel) throw ()
{
  switch (logLevel)
  {
    case bmd2::Logger::LogLevel::LOG_ERROR:
      return std::string ("ERROR");
      break;
    case bmd2::Logger::LogLevel::LOG_WARNING:
      return std::string ("WARNING");
      break;
    case bmd2::Logger::LogLevel::LOG_INFO:
      return std::string ("INFO");
      break;
    case bmd2::Logger::LogLevel::LOG_DEBUG:
    default:
      return std::string ("DEBUG");
      break;
  }
}

Eclipse將其報告為錯誤,因為無論使用哪種C ++分析工具/庫,都不能推斷出switch語句中的default情況實際上是該函數的結尾。 即使Eclipse另有說明,這也應該表現得很好。 和平解決Eclipse的更好方法可能是將默認return語句放在switch語句之后。

std::string bmd2::Logger::getLogLevelName(bmd2::Logger::LogLevel logLevel) throw ()
{
  switch (logLevel)
  {
    case bmd2::Logger::LogLevel::LOG_ERROR:
      return std::string ("ERROR");
    case bmd2::Logger::LogLevel::LOG_WARNING:
      return std::string ("WARNING");
    case bmd2::Logger::LogLevel::LOG_INFO:
      return std::string ("INFO");
    case bmd2::Logger::LogLevel::LOG_DEBUG:
    default:
      // We will return the default value after the switch statement.
      break;
  }
  // Return default value.
  return std::string ("DEBUG");
}

之所以出現此錯誤,是因為您的編譯器(Eclipse)在switch范圍內看不到return -statement。 你可以加

return std::string("CAN-BE-ANY-THING");  // this line will never be called though

在函數末尾擺脫錯誤。

在C ++中,編寫一個聲明為返回值但從未實際執行的函數是完全合法的。 僅當運行時的執行實際上從該函數返回而不返回值時,才會出現問題。

// this program is perfectly legal and well behaved; just don't ever call foo()
int foo() {}

int main() { return 0; }

但是程序員希望編譯器幫助他們生成正確且行為良好的程序,因此,編譯器會嘗試找出程序何時可能會做不好的事情,並告訴程序員有關它們的信息。 問題在於,C ++定義了“壞事”,因此要想在編譯時真正弄清它們是否真的可能發生,就必須解決例如停止問題。

顯然,編譯器無法做到這一點,因此,在試圖幫助程序員的過程中,有時編譯器會出錯。 希望編譯器在大多數情況下都能很好地處理大多數實際代碼,但是不可避免地會出現編譯器無法處理的情況,從而導致誤報(在該情況下,編譯器會警告無法真正發生的問題)或假陰性(編譯器未能警告可能發生的問題)。

您有兩種基本選擇:要么告訴編譯器停止嘗試以產生此消息的特定方式(通過禁用此警告)來幫助您,要么可以更改代碼,以便編譯器的非正確分析仍然可以弄清楚它總是返回一個值。


除了C ++外,其他語言也采用了其他方法,例如簡單地將未能返回值的行為合法化,以便通過簡單的分析就可以看到返回值。 例如,C#明確采用了該路由,以便編譯器可以對其進行檢查並完全正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM