2017-09-11 16 views
3

私はVS 2015 jsoncppでコンパイルし、それとリンクすることができ、everythignは正常に動作します。JsonCppを使用しているとき、廃止された警告とその削除方法はどのように機能しますか?

ただし、廃止予定の警告音が出ています。コードにdepecratedとしていくつかのクラスがマークされます。

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

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

事は、私はこれらのクラスを使用していないです。ファイルが含まれるとすぐにメッセージが表示されます。これをコンパイル:

#include <json/json.h> 

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

    return 0; 
} 

は13非推奨の警告を生成します...

は、これらの警告は、唯一の非推奨クラス/関数を使用するときに報告することになっていませんか?この方法で動作させる方法はありますか? (私はC4996の警告を無効にすることができましたが、有効にしておくのが良いでしょうが、廃止予定のクラス/機能が実際に使用されたときにのみ報告されます)。

+0

ヘッダーの周りにいくつかの '#pragma push'' #pragma pop'を付けて、特定の警告を無効にすることはできます。 – Jarod42

+1

@ Jarod42:確かに、非推奨の関数を使用しても無効になります... MSDNのドキュメントでは、廃止されたクラスが使用されている場合にのみC4996が 'deprecated'と報告されています。 headreファイルを含む? – jpo38

+0

BTWでは、VS2012ではこの現象が見られましたが、2015では発生しませんでした。 – Motti

答えて

3

私は問題は、いくつかのクラスは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; 
} 

警告:、問題がWriterクラスは(に由来することである

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

派生クラスが実際に使用されている場合のみ必要です。クラスAは、廃止されたクラスBから派生していれば、Aをインスタンス化する限り、サッシ警告はありません... – jpo38

+0

私はコードを見て、2つのクラスは 'Writer'から派生し、どちらも使用されていません。 – Motti

+0

答えを受け入れる。そんな愚かなやり方でこれを実装しているのは残念なことだ... – jpo38

1

@FlosAwsm saidようにもかかわらず派生クラスも使用されません)。

この問題を修正した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および非推奨のクラスWriterから派生StyledWriterによって引き起こされたことに注意してください。クラス定義の警告を無効にすることで、コードのクライアントが制御できない、この使用に関する警告をコンパイラーが防ぎます。

これ以外の使用(直接Writerまたはいずれかの派生クラスのいずれか)では、引き続き推奨されていない動作が発生します。

+1

ありがとう。 3番目のクラス 'StyledStreamWriter'を忘れてしまったことに注意してください。また、クラス宣言の最後に '#pragma warning(pop)'を実行しなければなりません。警告が残っています(少なくともVS 2015の内容です) – jpo38

+1

ありがとう、@ jpo38。あなたの提案をMottiのプルリクエストに含めました。 – cdunn2001

+0

@ jpo38、私は実際には 'StyledStreamWriter'で廃止予定警告を無効にする必要があるとは思わない。 'StyledWriter'と' FastWriter'はどちらも廃止された(したがってWriterを使うためにVSによって考慮される)Writerから派生したものです。 'StyledStreamWriter'自体は非推奨です(' Writer'と同じです)。非推奨クラスは使用しません。 – Motti

関連する問題