差分

2014-10-17 44 views
4

爲了儘可能在Visual Studio下C/C++棄用聲明的對象,則有三種解決方法:差分

  • #pragma deprecated(X)
  • __pragma(deprecated(X))
  • __declspec(deprecated(X))

前兩個是相同的,但只有第二個可以在宏內使用;我已經把第一個唯一的完整性。第三個似乎是開發社區中使用最多的。

我想知道最後兩個之間有什麼區別。根據MSDN herehere的文檔,我知道沒有區別。在這種情況下奇怪的是,根據您使用的是什麼提出了不同的警告代碼:C4995爲pragma-case,C4996爲declspec-case。

因此,有人知道是否有實際差異(任何微小的),或爲什麼這些指令不會引發相同的警告代碼?

+3

大型項目的#pragma縮放比例很差,因爲它沒有附加到您要棄用的特定函數。意外匹配是一種風險,特別是在C++名稱空間中。 __declspec沒有這樣的問題,它應該是你的偏好。 – 2014-10-17 16:48:53

回答

7

deprecated (C++)

(Microsoft專用)下面指出的例外,該棄用聲明提供相同的功能過時的編譯:

  • 棄用聲明讓你指定特定形式的函數重載爲不推薦使用,而雜注形式適用於函數名稱的所有重載形式。
  • 已棄用聲明允許您指定將在編譯時顯示的消息。消息的文本可以來自宏。
  • 宏只能標記爲已棄用與棄用的附註。

對於#pragma__pragma,看到Pragma Directives and the __Pragma Keyword

的__pragma()關鍵字

微軟特定

編譯器還支持__pragma關鍵字,它具有與#pragma指令相同的功能,但可以在宏定義中內聯使用。


是有意義的注意,因爲@Deduplicator提到的,C++ 14介紹[[deprecated]]屬性。

7.6.5已過時的屬性[dcl.attr.deprecated]

屬性令牌deprecated可以用來標記的名稱和它的使用仍然是允許的實體,但 不贊成爲一些原因。 [備註:特別是,deprecated適用於 被視爲過時或不安全的名稱和實體。 - 尾註]

+0

是的,我只是看那一點。事實上,只有declspec解決方案允許在編譯期間自定義消息。 – Bentoy13 2014-10-17 16:23:00

2

我還發現了一件事。

我有這個類在頭文件中定義:

class X 
{ 
    void F1(); 
    void F2(); 
} 

現在,我想棄用F1,但是當你使用pragma deprecated我得到即使警告每次包含頭文件時,F1從未使用過。

class X 
{ 
#pragma deprecated(F1) 
    void F1(); 
    void F2(); 
} 

現在改爲使用__declspec(deprecated()),準確地在使用時,F1,你只能得到不推薦使用的消息。在我看來,你不應該使用#pragma deprecated,除非你想讓人們使用#pragma warning (disable: 4995),因爲它是非常令人討厭的警告,你不能擺脫。

class X 
{ 
    __declspec(deprecated("Please use F2")) void F1(); 
    void F2(); 
} 
+1

它匹配Hans Passant的評論;在所有情況下,'__declspec(deprecated())'應該是首選,除了棄用一個宏。感謝您爲C++指出了這一事實。 – Bentoy13 2014-11-25 08:18:06