![](/img/trans.png)
[英]C++: deprecated conversion from string constant to 'LPSTR {aka char*}' [-Wwrite-strings] - warning. How to avoid?
[英]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.