C++;标记为已弃用 我在一个界面中有一个方法,我想用便携式C++来描述它。 当我在谷歌上搜索时,我得到的只是一个微软特有的解决方案;和

C++;标记为已弃用 我在一个界面中有一个方法,我想用便携式C++来描述它。 当我在谷歌上搜索时,我得到的只是一个微软特有的解决方案;和,c++,C++,第二名的解决方案是ifdef一个MSVC和一个GCC解决方案。在GCC中,您可以用如下不推荐的属性声明您的函数: void myfunc() __attribute__ ((deprecated)); #if defined(__cplusplus) && (__cplusplus >= 201402L) # define HEDLEY_DEPRECATED(since) [[deprecated("Since " #since)]] # define HEDLEY_

第二名的解决方案是
ifdef
一个MSVC和一个GCC解决方案。

在GCC中,您可以用如下不推荐的属性声明您的函数:

void myfunc() __attribute__ ((deprecated));
#if defined(__cplusplus) && (__cplusplus >= 201402L)
#  define HEDLEY_DEPRECATED(since) [[deprecated("Since " #since)]]
#  define HEDLEY_DEPRECATED_FOR(since, replacement) [[deprecated("Since " #since "; use " #replacement)]]
#elif \
  HEDLEY_GCC_HAS_EXTENSION(attribute_deprecated_with_message,4,5,0) || \
  HEDLEY_INTEL_VERSION_CHECK(16,0,0) || \
  HEDLEY_ARM_VERSION_CHECK(5,6,0)
#  define HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since)))
#  define HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement)))
#elif \
  HEDLEY_GCC_HAS_ATTRIBUTE(deprcated,4,0,0) || \
  HEDLEY_ARM_VERSION_CHECK(4,1,0)
#  define HEDLEY_DEPRECATED(since) __attribute__((__deprecated__))
#  define HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__))
#elif HEDLEY_MSVC_VERSION_CHECK(14,0,0)
#  define HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since))
#  define HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement))
#elif HEDLEY_MSVC_VERSION_CHECK(13,10,0)
#  define HEDLEY_DEPRECATED(since) _declspec(deprecated)
#  define HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated)
#else
#  define HEDLEY_DEPRECATED(since)
#  define HEDLEY_DEPRECATED_FOR(since, replacement)
#endif
这将在.c文件中使用该函数时触发编译时警告

您可以在“诊断杂注”下找到更多信息,网址为

在处理可移植项目时,几乎不可避免的是,在某些时候,您需要一部分针对一系列平台的预处理备选方案#如果定义这个#如果定义那个等等

在这样的部分中,您可以有条件地定义一种不推荐符号的方法。我通常倾向于定义一个“警告”宏,因为大多数工具链都支持自定义编译器警告。然后,您可以继续使用一个特定的警告宏来进行弃用等操作。
对于支持专用弃用方法的平台,您可以使用该方法而不是警告。

这应该可以做到:

#ifdef __GNUC__
#define DEPRECATED(func) func __attribute__ ((deprecated))
#elif defined(_MSC_VER)
#define DEPRECATED(func) __declspec(deprecated) func
#else
#pragma message("WARNING: You need to implement DEPRECATED for this compiler")
#define DEPRECATED(func) func
#endif

...

//don't use me any more
DEPRECATED(void OldFunc(int a, float b));

//use me instead
void NewFunc(int a, double b);
但是,如果函数返回类型的名称中有逗号(例如,
std::pair
),则会遇到问题,因为预处理器会将其解释为向不推荐使用的宏传递2个参数。在这种情况下,您必须键入def返回类型


编辑:更简单(但可能不太兼容)的版本。

在C++14中,可以使用
[[deprecated]]
属性将函数标记为已弃用(请参见第7.6.5节[dcl.attr.deprecated])

属性标记
已弃用
可用于标记仍允许使用的名称和实体,但由于某些原因不鼓励使用

例如,不推荐使用以下函数
foo

[[deprecated]]
void foo(int);
[[deprecated("Replaced by bar, which has an improved interface")]]
void foo(int);
可以提供一条消息,说明名称或实体被弃用的原因:

[[deprecated]]
void foo(int);
[[deprecated("Replaced by bar, which has an improved interface")]]
void foo(int);
消息必须是字符串文字


有关更多详细信息,请参阅。

以下是my的简化版本:

另见:


    • 以下是2018年更完整的答案

      现在,许多工具不仅允许您将某些内容标记为已弃用,还允许您提供消息。这允许你告诉人们什么时候某件东西被弃用了,也许可以让他们找到替代品

      编译器支持的种类仍然很多:

      • C++14支持
        [[deprecated]]
        /
        [[deprecated(message)]]
      • GCC4.0+和ARM4.1支持
        \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu+
      • \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
        
        • 一般条款4.5+
        • 几个伪装成GCC 4.5+的编译器(通过设置
        • “英特尔C/C++编译器”至少可追溯到16(您不能信任
          \uuu GNUC\uuuu
          /
          \uu GNUC\u MINOR\uuuu
          ,他们只是将其设置为安装的GCC的任何版本)
        • 武器5.6+
      • MSVC从13.10(Visual Studio 2003)起就支持
        \uu declspec(已弃用)
      • MSVC从14.0(Visual Studio 2005)起就支持
        \uu declspec(已弃用(消息))
      基于
      \u has\u cpp\u属性(gnu::deprecated)
      ,您还可以在C++11中的clang的最新版本中使用
      [[gnu::deprecated]]

      我有一些宏可以自动处理所有这些,我会保持更新,但当前版本(v2)如下所示:

      void myfunc() __attribute__ ((deprecated));
      
      #if defined(__cplusplus) && (__cplusplus >= 201402L)
      #  define HEDLEY_DEPRECATED(since) [[deprecated("Since " #since)]]
      #  define HEDLEY_DEPRECATED_FOR(since, replacement) [[deprecated("Since " #since "; use " #replacement)]]
      #elif \
        HEDLEY_GCC_HAS_EXTENSION(attribute_deprecated_with_message,4,5,0) || \
        HEDLEY_INTEL_VERSION_CHECK(16,0,0) || \
        HEDLEY_ARM_VERSION_CHECK(5,6,0)
      #  define HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since)))
      #  define HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement)))
      #elif \
        HEDLEY_GCC_HAS_ATTRIBUTE(deprcated,4,0,0) || \
        HEDLEY_ARM_VERSION_CHECK(4,1,0)
      #  define HEDLEY_DEPRECATED(since) __attribute__((__deprecated__))
      #  define HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__))
      #elif HEDLEY_MSVC_VERSION_CHECK(14,0,0)
      #  define HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since))
      #  define HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement))
      #elif HEDLEY_MSVC_VERSION_CHECK(13,10,0)
      #  define HEDLEY_DEPRECATED(since) _declspec(deprecated)
      #  define HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated)
      #else
      #  define HEDLEY_DEPRECATED(since)
      #  define HEDLEY_DEPRECATED_FOR(since, replacement)
      #endif
      
      如果您不想使用Hedley,我将把它作为一个练习,以找出如何摆脱
      *.\u版本检查
      *.\u具有\u属性
      宏(我编写了Hedley,因此不必经常考虑)


      如果使用GLib,则可以使用和宏。它们不像Hedley的编译器那样健壮,但如果您已经使用GLib,则没有什么可添加的。

      对于英特尔编译器v19.0,将其用作
      \u英特尔编译器
      计算结果为
      1900

      #  if defined(__INTEL_COMPILER)
      #    define DEPRECATED [[deprecated]]
      #  endif
      
      适用于以下语言级别:

      • C++17支持(/Qstd=C++17)
      • C++14支持(/Qstd=C++14)
      • C++11支持(/Qstd=C++11)
      • C11支架(/Qstd=C11)
      • C99支持(/Qstd=C99)

      英特尔编译器有一个缺陷,它不支持所有其他编译器在某些语言元素上使用的
      [[deprecated]]]
      属性。例如,使用英特尔编译器v19.0在GitHub上编译(非常出色)库的v6.0.0。它会坏的。然后查看.

      而不是#错误,最好是#定义DEPRECATED(func)funcmxp:DEPRECATED只是一个警告,因此我认为您只需要一个不支持它的警告。是的,我会选择“警告您需要为此编译器实现DEPRECATED”之类的内容。如果这是不可能的,那么搬运工可以定义不受欢迎的函数,并且没有它生存。不幸的是,没有一种标准的方法来输出C++中的编译警告:P。因此,宏可以简化。如何
      [[deprecate]]
      禁用的宏?:-)我看不出这两个答案有什么显著的区别。你为什么要第二次发布它?你不必把它包装在函数中,所以它是
      不推荐的voidfoo(…)而不是
      已弃用(void foo(…)您应该编辑您的2008答案,而不是发布新答案。这可能与我的其他答案不太兼容,因此我单独添加了此答案。您可以在宏中使用[[deprecated]]吗?@Zambi您应该能够,因为宏在编译之前由预处理器处理。[[deprecated]]应该出现在宏计算的位置(并让编译器输出相关警告)。以及如何