簡體   English   中英

警告 控制到達非無效 function c++ 的末端

[英]WARNING Control reaches end of non-void function c++

我在 C++ 代碼中有以下 function (這只是一個例子)

Object& XYZ::getObject(InObj obj) {
  try{ 
      return obj.getObj();
  }
  DC_THROW_ERROR(ExceptionObj, "Object Not Found");   // Macro which throws an exception
}

當我編譯上面的代碼時,我得到警告(即控制到達非無效函數的結尾)..宏在編譯之前被擴展。 所以編譯器知道,如果它沒有返回一些東西,它就會拋出異常。 如果是這樣,為什么編譯器會發出警告? 這些類型的功能在我的項目中無處不在。 為了擺脫這些警告,我在宏之后寫了下面的行。

return *(static_cast<Object*>(0)); 

這是修復它的正確方法嗎? 我知道它有點狡猾。我無法更改代碼,因為我必須更改大約 1000 個函數。 所以有人可以告訴我是否有更好的修復方法嗎?

謝謝

聽編譯器。 擺脫(到目前為止未公開的)宏。 或者只是修復它,但最好擺脫它——你陷入了 make-C++-look-like-language-X 的事情,這是不好的。

干杯&hth.,

假設問題中的代碼是導致問題的代碼的忠實表示,宏 DC_THROW_ERROR 必須類似於

#define DC_THROW_ERROR(err) catch(...) {throw err;}

DC_THROW_ERROR("Object Not Found")之后的分號因此導致

Object& XYZ::getObject(InObj obj) {
  try { 
    return obj.getObj();
  }
  // This is the expansion of DC_THROW_ERROR("Object Not Found")
  catch (...) {
    throw ("Object Not Found");
  }

  ; // This is the semicolon that follows DC_THROW_ERROR("Object Not Found")

}

正是那個無關緊要的分號,而不是宏,讓編譯器對控制到達非 void function 的末尾感到頭暈目眩。 也就是說,由於 C 和 C++ 中的語句應該以分號結尾,因此代碼的人類作者自然會在宏調用結束后添加分號。

你真的需要一個宏嗎? 宏通常是邪惡的。 這個宏是邪惡的化身。

  • 它使 try-catch 塊看起來像無效語法。 使代碼看起來無效的宏是雙重邪惡的。
  • 它重命名語法。 #define BEGIN {是邪惡的。 重命名語法的宏是雙重邪惡的。
  • 它邀請程序員在末尾添加分號。 不應跟隨分號的宏是雙重邪惡的。
  • 顯然沒有記錄宏調用不應跟分號。 做壞事但不記錄邪惡的宏是雙重邪惡的。

總而言之,這個宏是 2x2x2x2,或十六倍邪惡。 這使得這個惡魔代碼。

暫無
暫無

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

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