不推荐使用的警告如何工作以及如何在使用 JsonCpp 时删除它们?

How works deprecated warnings and how to remove them when using JsonCpp?

我用 VS 2015 jsoncpp 编译并且能够 link 并且一切正常。

但是,我收到了已弃用的警告音。一些 类 在代码中被标记为 depecated:

class JSONCPP_DEPRECATED("Use StreamWriter instead") JSON_API Writer {...};

#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))

问题是我不使用那些 类。一旦包含文件,我就会收到消息。编译:

#include <json/json.h>

int main( int argc, char* argv[] )
{

    return 0;
}

产生 13 个弃用警告...

难道这些警告不应该只在使用已弃用的 class/function 时报告吗?有没有办法让它以这种方式工作? (我可以禁用警告 C4996,但最好保持启用状态,但仅在实际使用已弃用的 class/function 时才会报告)。

我认为问题在于,某些 类 来自 Writer。这算作被使用。不过,我不知道如何摆脱这些警告。

编辑: 测试了它。它产生了 5 次相同的警告,但没有被使用。

test.h

class __declspec(deprecated("Depricated Warning UnusedClass")) UnusedClass
{
public:
    void SetI(int &val);
};

class __declspec(deprecated("Depricated Warning UnusedClass")) UnusedClass2 : UnusedClass
{
public:
    int GetI();
    int i;
};

test.cpp

void UnusedClass::SetI(int &val)
{
    val = 0;
}

int UnusedClass2::GetI()
{
    return 10;
}

警告:

Warning 7   warning C4996: 'UnusedClass': Depricated Warning UnusedClass    C:\Users\admin\Documents\Test.h 144

As ,问题是 Writer class 是从(即使派生的 classes 也没有使用)。

我已经提交了一个 pull request 来解决这个问题,同时您可以执行我对您的本地 jsoncpp 副本所做的更改。

+++ include/json/writer.h
+#pragma warning(push)
+#pragma warning(disable:4996) // Deriving from deprecated class
class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API FastWriter : public Writer {
+#pragma warning(pop)

+#pragma warning(push)
+#pragma warning(disable:4996) // Deriving from deprecated class  
class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API StyledWriter : public Writer {  
+#pragma warning(pop)  

请注意,该警告是由 FastWriterStyledWriter 派生自已弃用的 class Writer 引起的。通过禁用 classes 定义中的警告,我们可以防止编译器对这种使用发出警告,代码的客户端无法控制这种使用。

任何其他使用(直接使用 Writer 或派生的 classes)仍会产生弃用警告(这是期望的行为)。