Visual Studio 2013 で pragma warning による警告抑止が効かないケースがあったので、メモです。
気づいたのは、iutest で MSVC の警告撲滅をしていたのがきっかけです。
問題のコードはこちら
https://github.com/srz-zumix/iutest/blob/6a2a798458aa220f2d1a88b8a79be39a867e8709/include/internal/iutest_port.hpp#L283
templateclass IUStreamBuffer { public: // __pragma(warning (push)) // __pragma(warning (disable: 4996)) IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_BEGIN() explicit IUStreamBuffer(FILE* fp) : m_fp(fp) { m_buf[0] = '\0'; fflush(fp); setvbuf(fp, m_buf, _IOFBF, SIZE); } ~IUStreamBuffer() { fflush(m_fp); setbuf(m_fp, NULL); } // __pragma(warning (pop)) IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_END()
VS2017 や VS2015 では上記の書き方で問題がなかったのですが、Visual Studio 2013 では正しく警告抑止ができてませんでした。
templateclass IUStreamBuffer { public: explicit IUStreamBuffer(FILE* fp) : m_fp(fp) { m_buf[0] = '\0'; fflush(fp); setvbuf(fp, m_buf, _IOFBF, SIZE); } ~IUStreamBuffer() { // __pragma(warning (push)) // __pragma(warning (disable: 4996)) IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_BEGIN() fflush(m_fp); setbuf(m_fp, NULL); // __pragma(warning (pop)) IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_END() }
こうだとちゃんと警告が抑止されたので、どうやら書く場所が悪かったみたいです。
(今は setvbuf 使うようにして抑止しなくていいようにしたので、上記コードはなくなりました)
まとめ
最新のコンパイラーなら大丈夫なのかもしれませんが、pragmra warning はどこにでも書けるという認識が間違っていた、というのは良い収穫でした。極力、警告抑止はない方がいいですが、使う場合はなるべく小さなスコープで書くようにしたいと思います。
今回は以上です。では。
0 件のコメント:
コメントを投稿