命名空间
变体
操作

C++ 属性: 已弃用 (自 C++14 起)

来自 cppreference.com
< cpp‎ | 语言‎ | 属性
 
 
C++ 语言
 
 
属性
(C++23)
deprecated
(C++14)
(C++20)
(C++17)
(C++11)
(C++20)
 

指示使用此属性声明的名称或实体已弃用,即使用是允许的,但出于某种原因不鼓励。

内容

[编辑] 语法

[[deprecated]] (1)
[[deprecated( 字符串文字 )]] (2)
字符串文字 - 一个未评估的字符串文字,可用于解释弃用的理由和/或建议替换实体

[编辑] 解释

指示使用此属性声明的名称或实体是允许的,但出于某种原因不鼓励。编译器通常会在此类使用上发出警告。字符串文字(如果指定)通常包含在警告中。

此属性允许在以下名称或实体的声明中使用

  • [[deprecated]] typedef S* PS;,
  • using PS [[deprecated]] = S*;,
  • (非成员)变量,例如 [[deprecated]] int x;
  • 静态数据成员,例如 struct S { [[deprecated]] static constexpr char CR{13}; };
  • 非静态数据成员,例如 union U { [[已弃用]] int n; };,
  • 函数,例如 [[已弃用]] void f();,
  • 命名空间,例如 namespace [[已弃用]] NS { int x; },
  • 枚举,例如 enum [[已弃用]] E {};,
  • 枚举成员,例如 enum { A [[已弃用]], B [[已弃用]] = 42 };,
(自 C++17 起)
  • 模板特化,例如 template<> struct [[已弃用]] X<int> {};.

一个声明为非弃用的名称可以重新声明为弃用。一个声明为弃用的名称不能通过重新声明它而取消弃用,除非使用此属性。

[编辑] 示例

#include <iostream>
 
[[deprecated]]
void TriassicPeriod()
{
    std::clog << "Triassic Period: [251.9 - 208.5] million years ago.\n";
}
 
[[deprecated("Use NeogenePeriod() instead.")]]
void JurassicPeriod()
{
    std::clog << "Jurassic Period: [201.3 - 152.1] million years ago.\n";
}
 
[[deprecated("Use calcSomethingDifferently(int).")]]
int calcSomething(int x)
{
    return x * 2;
}
 
int main()
{
    TriassicPeriod();
    JurassicPeriod();
}

可能的输出

Triassic Period: [251.9 - 208.5] million years ago.
Jurassic Period: [201.3 - 152.1] million years ago.
 
main.cpp:20:5: warning: 'TriassicPeriod' is deprecated [-Wdeprecated-declarations]
    TriassicPeriod();
    ^
main.cpp:3:3: note: 'TriassicPeriod' has been explicitly marked deprecated here
[[deprecated]]
  ^
main.cpp:21:5: warning: 'JurassicPeriod' is deprecated: Use NeogenePeriod() instead ⮠
 [-Wdeprecated-declarations]
    JurassicPeriod();
    ^
main.cpp:8:3: note: 'JurassicPeriod' has been explicitly marked deprecated here
[[deprecated("Use NeogenePeriod() instead")]]
  ^
2 warnings generated.

[编辑] 参考文献

  • C++23 标准 (ISO/IEC 14882:2024)
  • 9.12.5 已弃用属性 [dcl.attr.deprecated]
  • C++20 标准 (ISO/IEC 14882:2020)
  • 9.12.4 已弃用属性 [dcl.attr.deprecated]
  • C++17 标准 (ISO/IEC 14882:2017)
  • 10.6.4 已弃用属性 [dcl.attr.deprecated]
  • C++14 标准 (ISO/IEC 14882:2014)
  • 7.6.5 已弃用属性 [dcl.attr.deprecated]

[编辑] 参见

C 文档 针对 deprecated