不推荐使用的警告如何工作以及如何在使用 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)
请注意,该警告是由 FastWriter
和 StyledWriter
派生自已弃用的 class Writer
引起的。通过禁用 classes 定义中的警告,我们可以防止编译器对这种使用发出警告,代码的客户端无法控制这种使用。
任何其他使用(直接使用 Writer
或派生的 classes)仍会产生弃用警告(这是期望的行为)。
我用 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)
请注意,该警告是由 FastWriter
和 StyledWriter
派生自已弃用的 class Writer
引起的。通过禁用 classes 定义中的警告,我们可以防止编译器对这种使用发出警告,代码的客户端无法控制这种使用。
任何其他使用(直接使用 Writer
或派生的 classes)仍会产生弃用警告(这是期望的行为)。