关于弃用的枚举类型的说明

时间:2014-07-10 08:30:07

标签: c++ enums deprecated

我试图找到一些帖子或文章,但我似乎无法找到一个很好的解释

  • 什么是已弃用的枚举类型
  • 弃用的含义,
  • 如何宣布或发现,
  • 如何处理,(或不处理)
  • 他们可能会导致什么问题?

将我转到一篇有用的文章也很棒 非常感谢你!

3 个答案:

答案 0 :(得分:3)

什么是弃用的枚举类型?

我从来没有听说过这样的措辞,但这基本上是enum(类型)标记为已弃用。

弃用的含义是什么?

不推荐使用意味着某些值,功能或甚至模块被标记为现在已过时或已替换。它仍然存在与旧代码的兼容性,但除非你真的需要,否则你不应该在新代码中使用它。请记住,在将来的版本中可能会将其删除。

如何宣布或发现它们?

遗憾的是,我不知道有任何真正的标准/跨平台方式。 The question linked in the comments有一些例子。如果您的编译器支持某些特殊标记(#pragma指令或某种属性),如果标记正确,它应该向您发出警告或类似信息。

如何处理,(或不处理)?

如上所述,尽量避免标记为已弃用的内容。通常会有一些替代或至少暗示将来如何/如何做到这一点。例如,如果您尝试在标记为已弃用的MSVC中使用某些标准库函数,则编译器通常会告诉您使用哪个函数。

它们可能导致什么问题?

目前,它们很可能不会导致任何问题,但您可能无法利用某些库提供的所有功能。例如,MSVC中的经典sprintf()从未检查写入的缓冲区长度。如果您尝试使用它,则会收到警告,要求您改用sprintf_s(),这将进行安全检查。您还没有必要这样做(它被标记为已弃用但未被删除),但您基本上错过了。如果最终删除了弃用的东西,不要忘记你的代码可能会破坏(以后需要进行重大的重写)。

答案 1 :(得分:2)

  

什么是弃用的枚举类型?

术语含糊不清,但暗示某些特定的枚举类型已被标记为已弃用:

  • 特定于编译器的表示法,如果它们被重复使用会出现警告或错误,和/或

  • 没有任何技术强制执行的文档(例如,是一个全面的公司和#34;编码标准"要求说只使用C ++ 11枚举类,或者特定枚举类型的API特定说明不建议使用)

  

弃用的含义是什么?

可以在系统的更高版本中删除该功能,通常是因为它被认为是劣质的(无论是对某些现有替代方案,还是在可维护性,性能,稳健性等方面)或不重要。

  

如何宣布或发现它们?

如果编译器强制执行弃用,那么它必须与enum类型包含在同一个翻译单元中:它可能位于相同的标题中,也可能位于通用的#34中; deprecation.h"标题等。以下是常见编译器的一些示例:

  • GCC:enum X [{ ... }] __attribute__ ((deprecated));

    • 针对个别枚举:enum X { E1 __attribute__((deprecated)) [= ] [, ...] };
  

如何处理,(或不处理)

如果可以,您应该调查他们为何被弃用以及替代方案是什么,并使用它们更改代码以避免它们。

  

它们可能导致什么问题?

它们造成的直接问题是您的编译器可能会生成警告或错误。

他们可能会被弃用,因为即使使用当前与软件相关的功能也可能是低效,错误等等,因此使用它们并不是最好的选择。例如,给定enum Image_Format { GIF, PNG, JPEG, SVG };,{{ 1}}可能在系统中被弃用,因为PNG已被证明对系统的用户更好 - 例如也许是因为它支持更好的颜色深度,更准确地保留颜色,或者GIF可能已被弃用,因为已发现某些客户端使用的Web浏览器无法显示它们,SVG可能是不推荐使用,因为它已知系统中的图像不是自然的摄影图像,尽管压缩文件较大,处理速度较慢,内存使用量较高,但格式仍然会导致视觉效果不佳 - 许多可能的动机都让人不赞成。

一个更大但不是立竿见影的问题是它们可能会随着软件的下一次修订而消失,并且#34;子系统"提供它们,因此如果您不将旧代码迁移出去并避免使用它们创建新代码,则必须修复软件才能使用该子系统的更新。

答案 2 :(得分:-1)

弃用意味着 -

  1. 您可以在当前最新的稳定版本中使用此功能,但此功能将在以后的某个版本中删除,但未提及。

  2. 它们由创建它们的库或SDK标记。有些语言使用attirubutes标记已弃用。就像C#使用 - [Obsolete]属性一样,我不确定C ++,也不知道他们用什么来标记弃用。

  3. 可以在以后的任何版本中删除它们。因此,如果您使用它们,您的代码或程序可能无法在将来的更新中使用,因为该功能可能已在未来的更新中删除。