[英]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.