如何使用警告作为错误来废弃C++代码的最佳实践?

5
我们有一个使用C ++编写的大型项目,并启用了警告作为错误。我们想弃用一些旧的API,自然而然地想到了使用[[deprecated]]语言特性。但这会触发-Wdeprecated-declarations警告,该警告会被转换为错误并导致构建失败。
现在,我们知道可以通过-Wno-error=deprecated-declarations禁用该特定警告的错误。但是,构建日志仍将充满编译器警告,使其更难以发现真正的编译器错误。
那么,我想知道人们是否有更好的解决方案来处理实践中的C ++弃用,在真实世界的大型项目中?

4
你希望将[[deprecated]]标记用于什么目的? - n. m.
2
通常,一个好的数据库维护者会认真对待废弃警告并像处理真正错误一样修复它们。因此,它们应该实际上是错误或至少是干扰他屏幕的警告。你还想要什么?似乎你想警告开发人员,但同时又不想打扰他们... - glades
4
有没有看到指向某个地方的诊断信息,怎么知道自己在某个地方使用了已弃用的函数呢? - StoryTeller - Unslander Monica
2
最佳实践是更新已弃用的代码。在大型项目中,您将有同样多的开发人员可以去修复潜在问题,而不是与警告优先级作斗争。 - Peter Krebs
1
真正的问题在于你的代码正在使用已弃用的API(只有在触发警告时才会出现这种情况)。你的代码不应该再使用已弃用的API。唯一可能使用它的地方是测试(为了保持兼容性),但在那里,你可以本地禁用警告 #pragma push ... pop - Marek R
显示剩余3条评论
3个回答

3
这是一种天真的方法,但你可不可以只做类似这样的事情:

#ifdef WARNING_DEPRECATED_ON
# define ATT_DEPRECATED __attribute__ ((deprecated))
#else
# define ATT_DEPRECATED
#endif 

1
这似乎是一个非常实用的方法。然后,您可以拥有一个特殊的 make 目标,当您想开始修复它们时触发所有已弃用的错误。 - Galik

3

你不能同时拥有蛋糕和吃掉它:如果你不想让弃用的函数使用时抛出错误(这可能是可以接受的),但也不想看到警告 - 那么为什么要首先将其弃用?

您可以通过数字抑制单个警告(有关VC ++解决方案,请参见此处:https://dev59.com/4Ww05IYBdhLWcg3wkirX#7159392), 但正确的方法确实是摆脱弃用的函数调用并更新API。


嘿,大家好,我不确定这里的SO礼仪是什么:我知道对于外部链接,我至少应该给出使用代码的摘要。对于指向其他SO答案的内部链接,您不需要这样做,对吗? - nick

0

你可以在本地进行一次提交,在该提交中弃用API并验证该提交无法构建,然后进行另一次提交以删除已弃用的API的使用。

如果您无法推送失败的构建,则此时可以将这两个本地提交压缩为一个“删除已弃用的API”提交。

但是构建日志仍将充满编译器警告,这使得更难以发现真正的编译器错误。

这并不完全正确。有许多-Wdeprecated-declarations警告,但是任何其他错误都会导致构建失败。在构建日志中使用ctrl-f "error:"并不困难。


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