2010-11-14 71 views
8

在C++中Qt 4.7有Q_OBSOLETE或Q_DEPRECATED嗎?如何將Qt中的某些東西標記爲過時(已棄用)?

或者是否有類似的C++宏或關鍵字?

+0

你想要什麼這樣一個宏或關鍵字做的結果? – bjoernz 2010-11-14 21:02:04

+1

如果發現使用中已棄用的構造,則發出警告。有關更好的解釋,請參閱http://en.wikipedia.org/wiki/Deprecation。 – 2010-11-14 21:26:41

回答

-2

通過「不建議使用的構造」,你的意思是「不推薦使用的成員函數」。您要求編譯時警告將您的注意力吸引到任何棄用函數的調用站點。

這在標準C++中不可能以任何合理的方式實現,而且我也沒有在G ++中看到任何支持這一點的屬性。 Qt無法真正添加這樣的功能,如果編譯器已經不支持它的話。

但是,Microsoft Visual C++支持__declspec(deprecated)擴展,我想可以爲G ++ 4.5編寫一個編譯器插件來添加類似的功能。

+0

看來我錯過了'__attribute __((已棄用))''在G ++中。 – 2011-01-21 15:07:59

0

您可能希望做類似的東西自己:

#ifdef Q_TREAT_OBSOLETE_AS_ERRORS 
#define Q_OBSOLETE(X) \ 
     BOOST_STATIC_ASSERT(false); \ 
     X 

#else 
#define Q_OBSOLETE(X) X 
#endif 

這種結構簡單替換的代碼一些過時的代碼/一部分,如果沒有Q_TREAT_OBSOLETE_AS_ERRORS定義否則產生編譯時錯誤。

請注意,BOOST_STATIC_ASSERT沒有範圍限制,宏也是Q_OBSOLETE

可能這不是解決問題的最佳方法,實際上我不確定這是否有用

您可能只需將代碼標記爲@obsolete或者直接在註釋中指出即可。

+0

這不起作用。這會導致編譯錯誤,如果不推薦使用的代碼是**編譯**,無論是否從其他地方調用該代碼。 – 2010-11-15 05:11:39

+0

@Ken好吧,顯然你沒有辦法檢查是否有一些代碼塊被實際調用。這個靜態斷言的事情只是幫助吸引人們注意不贊成使用的功能的編譯。 *實際上,所有這些Q_OBSOLETE的東西對我來說似乎都是不必要的。* – 2010-11-15 09:04:46

+0

他問(我認爲),因爲他習慣於Java,它可以註釋掉已棄用的函數,並在嘗試使用它時給予編譯器警告。 – 2010-11-15 14:50:31

1

只需使用

#warning 

指令

雖然不是C++標準是不太可能會遇到不支持它(see this SO question)編譯器。

+0

Windows/MSVC是Qt的一個相當普遍的目標,所以我不得不不同意「不太可能」。 – 2010-11-15 19:16:18

1
  1. 將實際功能從公共範圍中拉出來。
  2. 在公共範圍內創建另一個具有相同名稱的函數。
  3. 在該功能中插入您的警告/失敗代碼。
  4. 用新的來調用原件。
+2

這種方式不能發出編譯時警告。 – 2010-11-15 21:19:00

31

如果使用Q_DECL_DEPRECATED你應該得到你正在尋找例如爲:

Q_DECL_DEPRECATED void foo(); 
+6

這應該是被接受的答案。 – dom0 2014-09-13 23:00:56

相關問題