我可以防止嵌套的弃用方法调用引发警告吗?

Posted

技术标签:

【中文标题】我可以防止嵌套的弃用方法调用引发警告吗?【英文标题】:Can I prevent nested deprecated method calls from raising warnings? 【发布时间】:2015-07-27 08:35:22 【问题描述】:

我有一些库代码,其中有一些我想摆脱的遗留代码。为此,我开始将过时的方法标记为已弃用。当这些方法相互调用时,我会收到我不想看到的弃用警告(新功能意味着您只需要一次调用,因为暴露的类工作的内部结构较少)。

有没有办法抑制从OldMethodOldMethodHelper 的调用的弃用警告? ..或者更好的方法来完成这个?

例如(MyClass.h):

public ref class MyClass

public:
    [Obsolete]
    void OldMethodHelper();

    [Obsolete]
    void OldMethod();

    void NewMethod();
;

MyClass.cpp:

void MyClass::OldMethodHelper()

    // Some old helper method that's called both from within this class and externally.


void MyClass::OldMethod()

    OldMethodHelper(); // I don't want this call to raise a deprecation warning.


void MyClass::NewMethod()

    // A new method which replaces the calls to both of the previous methods.

代码是这样调用的:

int main(array<System::String ^> ^args)

    Console::WriteLine(L"Hello World");

    MyClass m;
    m.OldMethodHelper(); // This should raise a deprecation warning.
    m.OldMethod(); // This should raise a deprecation warning.
    m.NewMethod();

    return 0;

编辑 - 我发现another post on SO 建议使用#pragma warning(disable: 4996) 是可能的,但对我来说这似乎有点笨拙:

    void MyClass::OldMethod()
    
#pragma warning(push)
#pragma warning(disable: 4996) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
        OldMethodHelper(); // I don't want this call to raise a deprecation warning.
#pragma warning(pop)
    

Edit2 - 对代码示例进行了一些更正/澄清。

【问题讨论】:

能否禁用整个MyClass.cpp 文件的警告?只需添加#pragma warning(disable: 4996) 毕竟#includes?甚至不必推/弹出它。 是的,但我对这样做很谨慎,以防我压制其他我可能真正关心的警告。 很难理解这一点,C++/CLI 代码应该使用 [Obsolete] 属性来生成弃用警告。但是这些旧方法肯定是在一个单独的翻译单元中调用自己吗?然后只需使用预处理器,用#ifndef SOMEMACRO ... #endif 包装declspecs。并使用项目或文件设置定义 SOMEMACRO。 这是我从我们的代码库中(糟糕地)拼凑起来的一个稍微做作的例子。你是对的,那应该是一个 ref 类。他们确实是从一个单独的翻译单元调用的,@Dialectus 的回答巧妙地解决了这个问题。我做了一些修改以纠正这些缺点。 【参考方案1】:

在没有证据的情况下说话,但也许宏在这里可以提供帮助。显示比解释容易:

MyClass.h
---------

#ifndef MYCLASS_DEPRECATE
#define MYCLASS_DEPRECATE [Obsolete]
#endif

class MyClass

    MYCLASS_DEPRECATE void OldMethodHelper();

    ...


MyClass.cpp
-----------

#define MYCLASS_DEPRECATE
#include "MyClass.h"

// The rest of the code

【讨论】:

我认为这会产生相反的效果,即我只会在编译库时看到弃用警告.. ? 空宏在MyClass.cpp 中定义,就在#include 之前。这可以防止宏在MyClass.h 中为#defined__declspec(deprecated)。在所有其他源文件中,__declspec(deprecated) 附加到函数中。 @JonCage(之前的评论忘记提到你了) 啊,好吧,这很有道理。这看起来确实比在 pragma 中包装大量代码更简洁 :-)

以上是关于我可以防止嵌套的弃用方法调用引发警告吗?的主要内容,如果未能解决你的问题,请参考以下文章

AppAuth 的弃用警告

sklearn 的弃用警告

Bootstrap SCSS 中的弃用警告

连接到猫鼬时的弃用警告

Squeel load_core_extensions 的弃用警告

Python中的弃用警告,在这里有意义吗?