簡體   English   中英

如何在 GCC 中棄用 C 預處理器宏?

[英]How to deprecate a C pre-processor macro in GCC?

我知道如何使用__attribute__((deprecated))[[deprecated]]來棄用這樣的函數:

int old_fn() __attribute__ ((deprecated));
[[deprecated]] int old_fn2();

但是如何棄用這樣的宏:

#define OLD_MACRO 1

不錯,優雅的解決方案,但是取決於啟用的 C99(適用於 gcc 4.8.2 或更高版本,未在早期版本上測試):

#define DEPRECATED_MACRO1 _Pragma ("GCC warning \"'DEPRECATED_MACRO1' macro is deprecated\"") 7
#define DEPRECATED_MACRO2(...) _Pragma ("GCC warning \"'DEPRECATED_MACRO2' macro is deprecated\"") printf(__VA_ARGS__)

int main(int argc, char*argv[])
{
    int n = DEPRECATED_MACRO1;
    DEPRECATED_MACRO2("%d\n", n);
    return 0;
}

我認為你能做的最好的事情是這樣的:

#ifdef USE_DEPRECATED_MACROS
#warning using deprecated macros
#define OLD_MACRO 1
...
#endif

通過這種方式,您可以強制用戶將 -DUSE_DEPRECATED_MACROS 添加到他們的編譯器選項中,並且他們會收到警告。

您可以確保這些宏會擴展為包含會觸發__attribute__((deprecated))警告的表達式的內容。

對於類似函數的宏,這很容易(尤其是使用逗號運算符),但對於常量定義或非標准宏,這可能更復雜,因為這些擴展的上下文不同。 我認為你可以這樣做:

#define DEPRECATE(name) static inline void __attribute__((deprecated)) deprecate_ ## name (void) { ; }
...
#define MAX(x, y) (DEPRECATE(MAX), x>y?x:y)
// yeah, yeah, it repeats args in the body, but it's just an example

對於常量定義,您可能想假設主體必須在無需生成代碼的情況下進行評估,例如在函數體外部、在 switch/case 的目標中,或作為函數內靜態變量的初始值.

這很棘手,但您可以在很多事情上做到這一點。

我希望 C 有一個__builtin_warn(const char *)可以在編譯器級別(非預處理器)工作並使這樣的事情更容易。

對於常量定義,您可以執行以下操作:

#define THREE (DEPRICATED(THREE),3)

由於宏不是編譯器的一部分(它們是預處理器功能),因此沒有干凈的方法來做到這一點。 充其量,將已棄用的宏放在一個填充了#warnings 的新頭文件中。 這當然會破壞現有代碼,但這是保證引起人們注意棄用的一種方法。

暫無
暫無

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

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