【问题标题】:What is the best way to mark macro as deprecated?将宏标记为已弃用的最佳方法是什么?
【发布时间】:2019-08-13 13:06:53
【问题描述】:

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

#define MACRO1 4 //This is deprecated macro

【问题讨论】:

  • 宏是否在任何常量表达式上下文中使用?你知道__attribute__((deprecated)) 只适用于 gcc(和类似的)编译器。
  • 相关,如果有点旧:stackoverflow.com/questions/2681259/… 我认为它并不是真正的重复,因为它要求 GCC 特定的答案。这个问题需要更一般的答案。考虑到经过的时间,这里有明显的机会获得更新、更好的答案。
  • @KamilCuk,该宏在代码中使用,但未在其他宏中使用。我的意思是没有其他宏依赖于这个宏。
  • 请问宏是像struct A { char field : MACRO1; }还是static char arr[MACRO1];一样,作为常量表达式使用。
  • 确实是非常好的问题。

标签: c


【解决方案1】:

GCC(可能还有其他)

__attribute__((deprecated))

对于只有一个常量表达式的特定示例,您可以使用:

改变

#define X (4)

#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) 的唯一功能是抑制警告。谢谢凯文。

#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 完成。谢谢。
  • Some C++ compilers have problems with expanding do-while ininline functions 哦,哇。您有任何 C++ 编译器吗?有这方面的经验吗?
  • @KamilCuk 不。 Seltzer 试图编辑,但我同时编辑。我已经包含了该声明的来源。
  • @KamilCuk:该网站说从历史上看,一些 C++ 编译器拒绝内联扩展任何包含循环的函数。参考使用 do { multiple statements } while(0) 技巧来封装多个语句作为单个语句。这句话已经过时且无关紧要,任何仍在使用此类编译器的人都有更紧迫的问题需要处理,我们其他人不应该关心,特别是对于标记为 c 的问题。
猜你喜欢
  • 1970-01-01
  • 2014-08-20
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多