[英]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.