如何将 Qt 中的某些内容标记为过时(已弃用)?

Posted

技术标签:

【中文标题】如何将 Qt 中的某些内容标记为过时(已弃用)?【英文标题】:How to mark something in Qt as obsolete(deprecated)? 【发布时间】:2010-11-14 20:56:16 【问题描述】:

在带有 Qt 4.7 的 C++ 中是否存在 Q_OBSOLETE 或 Q_DEPRECATED?

或者有没有类似的 C++ 宏或关键字?

【问题讨论】:

你想让这样的宏或关键字做什么? 如果在使用中发现不推荐使用的构造,则发出警告。请参阅en.wikipedia.org/wiki/Deprecation 以获得更好的解释。 【参考方案1】:

如果你使用 Q_DECL_DEPRECATED,你应该得到你正在寻找的结果,例如:

Q_DECL_DEPRECATED void foo();

【讨论】:

我的情况,我确实使用了函数名 void foo() Q_DECL_DEPRECATED; 之后的属性;【参考方案2】:
    将真正的函数拉出公共范围。 在公共范围内创建另一个同名函数。 在该函数中插入警告/失败代码。 用新的调用原来​​的。

【讨论】:

不能以这种方式发出编译时警告。【参考方案3】:

只需使用

#warning 

指令

虽然不是 C++ 标准,但您不太可能遇到不支持它的编译器 (see this SO question)。

【讨论】:

Windows / MSVC 是 Qt 的一个相当常见的目标,所以我不得不不同意“不太可能”。【参考方案4】:

您可能想自己做一些类似的事情:

#ifdef Q_TREAT_OBSOLETE_AS_ERRORS
#define Q_OBSOLETE(X) \
        BOOST_STATIC_ASSERT(false); \
        X

#else 
#define Q_OBSOLETE(X) X
#endif

如果没有定义Q_TREAT_OBSOLETE_AS_ERRORS,则此构造仅替换一些不推荐使用的代码/部分代码,否则会生成编译时错误。

请注意,BOOST_STATIC_ASSERT 没有范围限制,Q_OBSOLETE 宏也是如此。

可能这不是解决您的问题的最佳方法,实际上我不确定这是否有用

您可以将代码标记为 @obsolete 或简单地在 cmets 中指出。

【讨论】:

这不起作用。如果不推荐使用的代码被编译,这将导致编译错误,无论该代码是否从其他地方调用。 @Ken 好吧,很明显你没有办法检查是否确实调用了某个代码块。这个静态断言只是有助于引起人们对已弃用功能的编译的关注。 实际上,所有这些 Q_OBSOLETE 东西对我来说似乎都是不必要的。 他问(我认为)是因为他习惯了 Java,Java 可以将函数注释为已弃用,并在您尝试使用它们时给您一个编译器警告。【参考方案5】:

“不推荐使用的构造”实际上是指“不推荐使用的成员函数”。您要求一个编译时警告以引起您对任何已弃用函数的调用站点的注意。

这在标准 C++ 中以任何合理的方式都是不可能的,而且我在 G++ 中也看不到任何支持这一点的属性。如果编译器还没有对它的支持,Qt 就不能真正添加​​这样的功能。

但是,Microsoft Visual C++ 支持__declspec(deprecated) 扩展,我想可以为 G++ 4.5 编写一个编译器插件,添加类似的功能。

【讨论】:

我好像错过了 G++ 中的__attribute__((deprecated)) 顺便说一句,在 c++14 中有 [[deprecated]] 关键字,您可以将其添加到某些函数 en.cppreference.com/w/cpp/language/attributes

以上是关于如何将 Qt 中的某些内容标记为过时(已弃用)?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在打字稿中将某些内容标记为已弃用?

将 WebApi 方法的参数标记为过时/不推荐用于 Swashbuckle / Swagger

将 PLSQL 过程/函数标记为已弃用

如何在 RAML 中将 REST 服务标记为已弃用

delphi 如何将属性标记为已弃用?

如何阻止 TinyMCE 用 span 替换已弃用的标签