如何最好地标记宏为弃用?

5

我知道如何通过使用__attribute__ ((deprecated))将枚举/函数标记为已弃用,但是如何将常量宏标记为已弃用呢?

#define MACRO1 4 //This is deprecated macro

宏是否在任何常量表达式上下文中使用?您知道__attribute__((deprecated))仅适用于gcc(和类似的)编译器。 - KamilCuk
相关内容,略有过时:https://dev59.com/v3E85IYBdhLWcg3wpFEa。我认为这并不完全是一个重复的问题,因为那个问题要求提供GCC特定的答案。而这个问题则要求提供更一般性的答案。由于时间的流逝,这里可能会出现更新、更好的答案。 - Andrew Henle
@KamilCuk,该宏在代码中使用,但不在其他宏中使用。我的意思是没有其他宏依赖于此宏。 - Haim
我想问一下宏是否被用作常量表达式,例如 struct A { char field : MACRO1; } 或者 static char arr[MACRO1]; - KamilCuk
1
确实是一个非常好的问题。 - klutt
这个回答解决了你的问题吗?如何在GCC中弃用宏? - Cœur
1个回答

4

GCC (以及可能其它编译器)

__attribute__((deprecated))

对于你的特定示例,如果只是一个常量表达式,你可以使用以下代码:

更改

#define X (4)

to

#define X_old (4)

然后添加

const int dep __attribute__((deprecated)) = 0;
#define X ((void)dep, X_old)

加法也是可行的:

#define X (X_old + dep)

对于过程宏,您可以这样做:

#define P_old do { ... } while(0)
#define P do { (void)dep; P_old; } while(0)

(void) 的唯一作用是抑制警告。感谢 Kevin。

#pragma message

另一种解决方案是将所有弃用的宏定义放在一个单独的头文件中,并使用 pragma。您可以结合使用 #ifdef 等指令:

#pragma message ("This header contains deprecated macros")

所有编译器

未引用的标签

使用未引用的标签:

#define P_old do { ... } while(0)
#define P do { P_IS_DEPRECATED: P_old; } while(0)

这种方法无法处理常量表达式宏,需要使用-Wall选项进行编译以获得警告信息。如果使用超过一次会触发错误。

未使用的变量:

#define P_old do { ... } while(0)
#define P do { int P_IS_DEPRECATED; P_old; } while(0)

对于常量表达式也不起作用。还需要使用-Wall,但可以多次使用。

旁注

请记得将常量表达式宏封装在括号中。宏#define X 2+3会使类似2*X的表达式扩展为2*2+3而不是2*(2+3)


你可以添加(void)dep;来消除未使用值的警告。 - Kevin
@Kevin 完成。谢谢。 - klutt
1
一些C++编译器在内联函数中扩展do-while存在问题。哦,哇。你有想到任何C++编译器吗?对此有什么经验吗? - KamilCuk
@KamilCuk 不是。Seltzer试图编辑,但我同时进行了编辑。我已经包含了该声明的来源。 - klutt
@R.. 我尝试了 #define Y (X+X),然后我打印了 2*Y,它给出了期望的结果。 - klutt
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接