过时警告是如何工作的,使用JsonCpp时如何删除它们?

4

我使用VS 2015编译了jsoncpp,并且能够与之链接,一切都运行良好。

然而,我收到了大量的弃用警告。代码中有些类被标记为已弃用:

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个已弃用警告...

这些警告难道不应该只在使用已弃用的类/函数时报告吗?有没有一种方法可以让它按照这种方式工作?(我可以禁用C4996警告,但最好保持启用,只有在实际使用已弃用的类/函数时才报告)。


你仍然可以通过在头文件周围使用一些 #pragma push#pragma pop 来禁用特定的警告。 - Jarod42
1
@Jarod42:好的,但是即使我使用了一个已弃用的函数,它也会禁用它...MSDN文档说,只有在使用已弃用的类时,“deprecated”才会报告C4996...那么为什么我只是包含头文件就收到了警告呢? - jpo38
顺便提一下,我在VS2012中看到了这种行为,但在2015中没有。 - Motti
2个回答

3

我认为问题在于,有些类继承自Writer。这被算作使用了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

只有在派生类也被使用的情况下才应该这样做...如果A类从已弃用的B类派生,只要没有实例化A,就不应该出现这样的警告... - jpo38
我查看了代码,发现有两个类继承自“Writer”,但都没有被使用。 - Motti

1

正如@FlosAwsm所说的那样,问题在于Writer类是从中派生出来的(即使派生类也没有被使用)。

我已经提交了一个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 继承自废弃类 Writer 引起的。通过在类定义处禁用警告,我们防止编译器对此使用发出警告,这超出了代码客户端的控制范围。
任何其他用法(直接使用 Writer 或任何派生类之一)仍将产生废弃警告(这是期望的行为)。

1
谢谢。请注意,您忘记了第三个类“StyledStreamWriter”。另外,“#pragma warning(pop)”必须在类声明的末尾执行。否则,警告将保留(至少在我使用VS 2015时是这样)。 - jpo38
1
谢谢,@jpo38。我已经将您的建议包含在Motti的拉取请求中。 - cdunn2001
@jpo38,我认为不需要禁用StyledStreamWriter的弃用警告。StyledWriterFastWriter都是从已经被弃用的Writer派生而来的(因此被VS视为使用Writer)。StyledStreamWriter本身也已经被弃用(与Writer相同),并且没有使用任何弃用的类。 - Motti
@Motti:问题是,当包含json.h时,VS会报告StyledStreamWriter属性childValues_indentString_indentation_已过时的警告...不清楚为什么会这样。 - jpo38
在这种情况下,我建议您在GitHub上跟进cdunn2001。 - Motti

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