Eri*_*ric 13 c c++ macros gcc deprecated
我知道如何使用不推荐使用的属性来弃用这样的函数:
int old_fn () __attribute__ ((deprecated));
Run Code Online (Sandbox Code Playgroud)
但是如何弃用这样的宏:
#define OLD_MACRO 1
Run Code Online (Sandbox Code Playgroud)
先感谢您.
埃里克
Aco*_*gua 12
漂亮,优雅的解决方案,但取决于启用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;
}
Run Code Online (Sandbox Code Playgroud)
我认为你能做的最好是这样的:
#ifdef USE_DEPRECATED_MACROS
#warning using deprecated macros
#define OLD_MACRO 1
...
#endif
Run Code Online (Sandbox Code Playgroud)
这样,您强制用户例如将-DUSE_DEPRECATED_MACROS添加到其编译器选项中,并且它们会收到警告.
您可以确保这些宏将扩展为包含将触发属性((不建议使用))警告的表达式的内容.
对于类似函数的宏,这很容易(特别是使用逗号运算符),但对于常量定义或非标准宏,这可能更复杂,因为这些扩展的上下文不同.我想你可以这样做:
#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
Run Code Online (Sandbox Code Playgroud)
对于常量定义,您可能希望假设主体必须在不必生成代码的情况下进行求值,例如在函数体外部,在switch/case的目标中,或者作为函数内静态变量的初始值.
这很棘手,但你可以做很多事情.
我希望C有一个__builtin_warn(const char*)可以在编译器级别(非预处理器)工作,并使这样的事情变得更容易.
对于常量定义,您可以:
#define THREE (DEPRICATED(THREE),3)
Run Code Online (Sandbox Code Playgroud)
由于宏不是编译器的一部分(它们是预处理器函数),因此没有干净的方法来执行此操作。最好的情况是,将已弃用的宏放入一个充满 #warnings 的新头文件中。这当然会破坏现有代码,但这是保证引起人们对弃用的注意的一种方法。
归档时间: |
|
查看次数: |
5025 次 |
最近记录: |