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的简化版本: 另见:
- C++14支持
/[[deprecated]]
[[deprecated(message)]]
- GCC4.0+和ARM4.1支持
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu+
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
- 一般条款4.5+
- 几个伪装成GCC 4.5+的编译器(通过设置
- “英特尔C/C++编译器”至少可追溯到16(您不能信任
/\uuu GNUC\uuuu
,他们只是将其设置为安装的GCC的任何版本)\uu GNUC\u MINOR\uuuu
- 武器5.6+
- MSVC从13.10(Visual Studio 2003)起就支持
\uu declspec(已弃用)
- MSVC从14.0(Visual Studio 2005)起就支持
\uu declspec(已弃用(消息))
- 以下是2018年更完整的答案
现在,许多工具不仅允许您将某些内容标记为已弃用,还允许您提供消息。这允许你告诉人们什么时候某件东西被弃用了,也许可以让他们找到替代品
编译器支持的种类仍然很多:
\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]]应该出现在宏计算的位置(并让编译器输出相关警告)。以及如何