如何在GCC中弃用宏?

时间:2010-04-21 08:15:26

标签: c++ c gcc macros deprecated

我知道如何使用属性弃用以弃用这样的函数:

int old_fn () __attribute__ ((deprecated));

但是如何弃用这样的宏:

#define OLD_MACRO 1

提前谢谢。

埃里克

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:8)

我认为你能做的最好的事情就是这样:

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

这样可以强制用户例如将-DUSE_DEPRECATED_MACROS添加到他们的编译器选项中,他们会收到警告。

答案 2 :(得分:5)

您可以确保这些宏会扩展到包含会触发属性((已弃用))警告的表达式。

对于类似函数的宏,这很容易(特别是使用逗号运算符),但对于常量定义或非标准宏,这可能更复杂,因为这些扩展的上下文不同。 我想你可以做到:

#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)

答案 3 :(得分:1)

由于宏不是编译器的一部分(它们是预处理器功能),因此没有干净的方法。最好将已弃用的宏放在填充了#warnings的新头文件中。这当然会破坏现有代码,但它是保证引起注意弃用的一种方法。