如何在Qt中将某个内容标记为已弃用(deprecated)?

14

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

或者是否有类似的C++宏或关键字可用?


你希望这样的宏或关键字做什么? - bjoernz
1
如果发现使用了不推荐的构造,请发出警告。请参阅http://en.wikipedia.org/wiki/Deprecation以获得更好的解释。 - Gad D Lord
6个回答

49

如果你使用Q_DECL_DEPRECATED,你应该能够得到你想要的结果,例如:

Q_DECL_DEPRECATED void foo();

1
在我的情况下,我确实在函数名后使用属性 void foo() Q_DECL_DEPRECATED;。 - Ratah

1

只需使用

#warning 

指令

虽然不是C++标准,但很少见到不支持它的编译器(参见这个SO问题)。


Windows / MSVC 是 Qt 相当常见的目标,因此我不同意 "相当不可能"。 - Kaleb Pederson

1
从公共范围中提取真实函数。 在公共范围内创建另一个同名函数。 在该函数中插入您的警告/故障代码。 调用新函数的原始函数。

3
无法以那种方式发出编译时警告。 - Ken Bloom

0

你可能想自己做类似的事情:

#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,或者在注释中指出它。


这个不起作用。如果弃用的代码被编译,无论是否从其他地方调用该代码,都会导致编译错误。 - Ken Bloom
@Ken 嗯,显然你没有办法检查某些代码块是否被调用。这个静态断言只是帮助引起对弃用功能的编译注意。实际上,所有这些 Q_OBSOLETE 的东西对我来说似乎都很不必要。 - Yippie-Ki-Yay
他在问(我认为)是因为他习惯了Java,可以使用注释标记函数已过时,并在尝试使用它们时给出编译器警告。 - Ken Bloom

0
2023年:
是的,Qt 定义了 `Q_DEPRECATED` 和 `Q_DEPRECATED_X` 宏来实现这个目的:
Q_DEPRECATED void myOldFunc();
Q_DEPRECATED_X("use myNewFunc instead") void myOldFunc2();

差别只是文本消息。
此外,C++14以标准形式提供[[deprecated("text")]]属性。如果使用C++ 14+,似乎会在幕后使用该属性。


-4
通过“弃用构造”实际上指的是“弃用成员函数”。您要求在任何已弃用函数的调用点上引起编译时警告以引起注意。
这在标准C++中无法以任何合理的方式实现,并且我也没有看到G++中支持此功能的任何属性。如果编译器没有支持,Qt实际上无法添加此类功能。
然而,Microsoft Visual C++支持__declspec(deprecated)扩展,我想可以编写一个针对G++ 4.5的编译器插件来添加类似的功能。

在G++中,我似乎错过了__attribute__((deprecated)) - Ken Bloom
2
顺便提一下,在C++14中有[[deprecated]]关键字,您可以将其添加到某些函数中。http://en.cppreference.com/w/cpp/language/attributes - Joan Marcè i Igual

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接