我知道如何通过使用__attribute__ ((deprecated))
将枚举/函数标记为已弃用,但是如何将常量宏标记为已弃用呢?
#define MACRO1 4 //This is deprecated macro
我知道如何通过使用__attribute__ ((deprecated))
将枚举/函数标记为已弃用,但是如何将常量宏标记为已弃用呢?
#define MACRO1 4 //This is deprecated macro
__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#define Y (X+X)
,然后我打印了 2*Y
,它给出了期望的结果。 - klutt
__attribute__((deprecated))
仅适用于gcc(和类似的)编译器。 - KamilCukstruct A { char field : MACRO1; }
或者static char arr[MACRO1];
。 - KamilCuk