0

0

C++中的属性[[deprecated]]是什么?(如何标记过时的接口)

穿越時空

穿越時空

发布时间:2026-02-19 13:00:12

|

698人浏览过

|

来源于php中文网

原创

[[deprecated]]需加在函数声明前,c++14+支持,可带说明字符串,须启用-wdeprecated-declarations警告,作用于可见声明而非定义,不适用于模板特化和宏。

c++中的属性[[deprecated]]是什么?(如何标记过时的接口)

怎么给函数加 [[deprecated]] 属性

直接在声明前加 [[deprecated]],编译器会在调用处报警告。比如:

[[deprecated]] void old_api();

注意:必须写在声明(declaration)上,不是定义(definition);头文件里声明了,所有包含它的源文件都会触发警告。

  • 支持 C++14 及以上,老项目如果用 C++11 需升级标准或改用编译器扩展(如 __attribute__((deprecated))
  • 不能加在模板特化上(template [[deprecated]] void f<int>();</int> 是非法的)
  • 类成员函数、重载函数、甚至 typedef 都能加,但 operator 重载要小心——有些编译器对 operator+ 这类隐式调用不总报警告

[[deprecated]] 的字符串参数怎么写才有效

可以带可选字符串说明原因和替代方案,比如:

[[deprecated("use new_api() instead")]] void old_api();

这个字符串只影响警告文案,不参与编译逻辑。但要注意:

立即学习C++免费学习笔记(深入)”;

  • 字符串内容不会被编译器校验,拼错、空格多、写成中文都没问题,但别留空([[deprecated("")]] 在某些 clang 版本会静默失效)
  • MSVC 和 GCC/Clang 对字符串长度无硬限制,但过长可能截断显示;建议控制在 80 字以内
  • 如果接口废弃分阶段(比如 v2.0 标记,v3.0 删除),字符串里写清版本号比写“即将移除”更可靠

为什么加了 [[deprecated]] 却没警告

常见原因不是属性写错了,而是编译器没开警告或调用方式绕过了检查:

  • GCC/Clang 默认不开 -Wdeprecated-declarations,需显式启用(CMake 中加 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wdeprecated-declarations")
  • MSVC 默认开启,但若项目设置了 /wd4996 就会禁用该警告
  • 通过函数指针调用、模板推导间接调用、或宏展开后调用,部分编译器可能不触发警告
  • 头文件未被重新包含(比如修改了声明但没改 include 路径),旧的预编译头仍用老声明

和宏定义废弃方式比,[[deprecated]] 有什么实际区别

宏(比如 #define OLD_API() do { /*...*/ } while(0) + 注释)完全不提供类型安全和编译期检查,而 [[deprecated]] 是语言级机制:

  • 它让 IDE 能高亮、跳转时标灰、自动补全时降权,宏做不到
  • 链接时若符号被内联或优化掉,宏废弃信息彻底丢失,[[deprecated]] 的警告仍保留在调用点
  • 无法用于宏本身([[deprecated]] #define BAD_MACRO 1 语法错误),想废弃宏得靠 #warning 或条件编译
  • 跨平台兼容性更好——不用为 GCC/Clang/MSVC 写三套属性宏

真正容易被忽略的是:属性只作用于「可见声明」。如果头文件里声明了 [[deprecated]],但实现文件里又写了同名非 deprecated 定义,链接不会报错,但调用方看到的仍是带警告的声明。这种不一致得靠代码审查或 CI 检查工具抓。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

116

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

359

2023.10.11

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

103

2023.09.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

573

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

216

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1553

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

640

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

945

2024.03.22

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.7万人学习

C 教程
C 教程

共75课时 | 4.8万人学习

C++教程
C++教程

共115课时 | 18.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号