簡體   English   中英

如何避免來自不推薦使用的嵌套 function 調用的警告?

[英]How to avoid warning from nested deprecated function call?

我支持 C++ 庫,並希望將一些遺留函數聲明為已棄用。 不幸的是,這些函數相互調用,我從它們的編譯中收到警告。 例如:

[[deprecated]] void foo();
[[deprecated]] void bar() { foo(); }

我想避免有關從 bar() 正文編譯中調用已棄用的 function 的警告,但如果 function 之外的某些人(未標記為已棄用)調用 foo() 或 bar(),仍然會有該警告。 有可能嗎?

雖然這不適用於發布的 OP 的情況,但由於bar() foo() ,因此有一個簡單的解決方案適用於面臨相同問題的任何人,但沒有該特定限制。 所以它可能對其他登陸這里的人有用。

實際上,您需要兩組不同的標題。 一種是圖書館的用戶使用它,一種是圖書館本身使用它。 在這種情況下我們可以這樣做,因為[[deprecated]]不應該對生成的代碼產生任何影響。

您“可以”單獨維護它們,但這顯然非常脆弱。 值得慶幸的是,該語言確實為我們提供了一種在一個文件中擁有相同 header 的兩個“版本”的方法:經常被誹謗,公平地說,也經常被濫用的宏。

作為獎勵,如果[[deprecated]]恰好是迫使用戶使用 C++14 或更高版本的原因,您可以通過檢查__cplusplus或適當的功能宏同時提供對舊版本標准的支持。

//mylib.h

#if !defined(MY_LIB_NO_DEPRECATE) && __has_cpp_attribute(deprecated)
  #define MY_LIB_DEPRECATED [[deprecated]]
#else
  #define MY_LIB_DEPRECATED
#endif

// ...

MY_LIB_DEPRECATED void foo();
MY_LIB_DEPRECATED void bar();

// ...

#undef MY_LIB_DEPRECATED

使用-DMY_LIB_NO_DEPRECATE編譯庫,就像在該過程的特定階段不存在棄用警告一樣。 用戶仍然會收到所有棄用警告,除非他們通過定義MY_LIB_NO_DEPRECATE明確選擇退出。

不要被這里使用的宏嚇到。 使用它們來區分相同 header 的內部/外部版本是一種常見且成熟的做法。 沒有它,Windows dll 幾乎是不可能寫出來的。

在 OP 的情況下,如果將bar()的定義從 header 移動到庫的實現中是可能的,那么它們也應該適用於 go。

您可以忽略棄用警告。 它在技術上不是可移植的,但它適用於所有 4 個主要編譯器,至少:

#if defined(__GNUC__)

#define MY_LIB_IGNORE_DEPRECATED_BEGIN \
    _Pragma("GCC diagnostic push") \
    _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")

#define MY_LIB_IGNORE_DEPRECATED_END \
    _Pragma("GCC diagnostic pop")

#elif defined(_MSC_VER)

#define MY_LIB_IGNORE_DEPRECATED_BEGIN \
    _Pragma("warning(push)") \
    _Pragma("warning(disable : 4996)")

#define MY_LIB_IGNORE_DEPRECATED_END \
    _Pragma("warning(pop)")

#else

#define MY_LIB_IGNORE_DEPRECATED_BEGIN
#define MY_LIB_IGNORE_DEPRECATED_END

#endif

你可以在圖書館范圍內做到這一點:

MY_LIB_IGNORE_DEPRECATED_BEGIN

[[deprecated]] void foo();
[[deprecated]] void bar() { foo(); }

MY_LIB_IGNORE_DEPRECATED_END

或者你可以只保護有問題的電話:

[[deprecated]] void foo();

[[deprecated]] void bar()
{
MY_LIB_IGNORE_DEPRECATED_BEGIN
    foo();
MY_LIB_IGNORE_DEPRECATED_END
}

暫無
暫無

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

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