[英]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++ 中的語句應該以分號結尾,因此代碼的人類作者自然會在宏調用結束后添加分號。
你真的需要一個宏嗎? 宏通常是邪惡的。 這個宏是邪惡的化身。
#define BEGIN {
是邪惡的。 重命名語法的宏是雙重邪惡的。總而言之,這個宏是 2x2x2x2,或十六倍邪惡。 這使得這個惡魔代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.