2011-07-10 106 views
1

我在C++代碼下面的函數(它只是一個例子)的端警告控制到達非void函數C++

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

當我編譯上面的代碼我得到警告(即控制到達的非端void函數)宏在編譯之前被展開。所以編譯器意識到如果它不返回拋出異常的東西。如果是這樣,編譯器爲什麼會給出警告這些類型的函數在我的項目中都是evrywhere。爲了擺脫這些警告我已經寫在宏後面的下面。

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

這是修復它的正確方法嗎?我知道它有點狡猾..我不能改變代碼,因爲我必須改變大約1000個函數。那麼任何人都可以請告訴我,如果有更好的方法來解決它?

謝謝

+8

你能提供宏的定義嗎? –

+1

OT:我想知道爲什麼你可以從一個被聲明返回一個Object的函數返回一個Object * ... – MartinStettner

+0

按照Oli提供宏的定義,以及你使用的是什麼編譯器。 –

回答

3

收聽編譯器。擺脫(迄今未公開的)宏。或者只是修復它,但更好地擺脫它 - 你進入make-C++ - look-like-language-X的東西,這是不好的。這分號後

乾杯&心連心,

+0

嗨,不幸的是,我不能得到的宏。 – user837680

2

假設在問題的代碼是代碼的忠實代表,是造成問題,宏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") 

}

這是多餘的分號,而不是宏,它使編譯器對控制達到非空函數的末尾感到眩暈。也就是說,由於C和C++中的語句應該以分號結束,因此代碼的人爲作者在宏調用結束後添加分號是很自然的。

你真的需要一個宏嗎?一般而言,宏是邪惡的。這個宏是邪惡的化身。

  • 它使try-catch塊看起來像無效語法。使代碼看起來無效的宏是非常邪惡的。
  • 它重命名語法。做#define BEGIN {是邪惡的。重命名語法的宏是非常邪惡的。
  • 它邀請程序員在最後添加分號。不應該用分號跟隨的宏是非常邪惡的。
  • 顯然,宏調用不應該跟分號一起記錄。做邪惡但不記錄邪惡的宏是非常邪惡的。

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

+0

嗨大衛..奇怪的是宏沒有捕捉任何異常。反過來它的thorwing通用的異常,從傳遞特定的異常對象創建。不知道這是否正確。這些宏都是在這個地方..所以我不能改變一切..只是試圖修復警告.. – user837680

+0

@user:或者該宏以'catch'開頭,或者你有一個無效的編譯器。一個'try'塊必須跟着至少一個'catch'。我假設你使用的是一個兼容的編譯器,猜測這個宏是什麼樣的。 **顯示宏**。奧利要求你從一開始就這樣做。現在我再次問你。 –

相關問題