【发布时间】:2015-07-27 08:35:22
【问题描述】:
我有一些库代码,其中有一些我想摆脱的遗留代码。为此,我开始将过时的方法标记为已弃用。当这些方法相互调用时,我会收到我不想看到的弃用警告(新功能意味着您只需要一次调用,因为暴露的类工作的内部结构较少)。
有没有办法抑制从OldMethod 到OldMethodHelper 的调用的弃用警告? ..或者更好的方法来完成这个?
例如(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 的回答巧妙地解决了这个问题。我做了一些修改以纠正这些缺点。
标签: c++-cli deprecation-warning