文章目录
前言
在开发库的时候,新版本如果对原来的功能有替代方案,并且你不想让用户使用原来的方法了怎么办?这时我们就可以用到deprecated标记符。
deprecated标记符
C++14引入了deprecated标记符,它可以用来标记有此属性的名字或实体被弃用,被弃用了以后你仍然可以使用,但是编译时会报warning。所以你在新版本库中弃用了某个函数,就可以使用deprecated告诉用户尽量不要使用。
语法
其语法如下,第一个只是告诉编译器我们弃用了这个名字,第二个是可以传入一个字面量信息,此信息会在Warning时展示出来:
[[deprecated]]
[[deprecated( "A string" )]]
实例
弃用 class & struct & union & enum
class & struct & union & enum 的弃用属性声明方式如下,都是放在中间:
class [[deprecated]] C{
};
struct [[deprecated]] S{
};
union [[deprecated]] U{
};
enum [[deprecated]] E{
A};
调用:
int main() {
C c;
S s;
U u;
E::A;
}
效果如下:
弃用别名 typedef & using
声明如下,注意using和typedef声明弃用属性时位置是不一样的:
[[deprecated]] typedef wchar_t* WSTR;
using STR [[deprecated]] = char*;
调用:
int main() {
WSTR wstr;
STR str;
}
效果如下:
变量(包括静态成员和非静态成员)
声明如下,第一个是一个弃用的全局变量,后面的是被弃用的成员。
[[deprecated]] int a;
class C{
public:
[[deprecated]] int b;
[[deprecated]] static int c;
};
调用:
int main() {
a;
C c;
c.b;
C::c;
}
效果如下:
函数
声明如下:
[[deprecated]] void func();
调用:
int main() {
func();
}
效果如下:
命名空间
声明如下:
namespace [[deprecated]] NS{
void func();
}
调用:
int main() {
NS::func();
}
效果如下:
枚举项
声明如下,弃用谁在其后面声明。我们这里只弃用了枚举项C
,没有弃用A
和B
。
enum E{
A,B,C[[deprecated]]};
调用:
int main() {
E::A;
E::C;
}
效果如下:
带字面量的deprecated属性
声明如下:
[[deprecated("Do not use this")]] void func();
调用:
int main() {
func();
}
效果如下,看波浪线处,输出了刚才定义的字面量: