Visual Studio 2013 で pragma warning による警告抑止が効かないケースがあったので、メモです。
気づいたのは、iutest で MSVC の警告撲滅をしていたのがきっかけです。
問題のコードはこちら
https://github.com/srz-zumix/iutest/blob/6a2a798458aa220f2d1a88b8a79be39a867e8709/include/internal/iutest_port.hpp#L283
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
template < int size= "BUFSIZ" > class 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() </ int > |
VS2017 や VS2015 では上記の書き方で問題がなかったのですが、Visual Studio 2013 では正しく警告抑止ができてませんでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
template < int size= "BUFSIZ" > class 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() } </ int > |
こうだとちゃんと警告が抑止されたので、どうやら書く場所が悪かったみたいです。
(今は setvbuf 使うようにして抑止しなくていいようにしたので、上記コードはなくなりました)
まとめ
最新のコンパイラーなら大丈夫なのかもしれませんが、pragmra warning はどこにでも書けるという認識が間違っていた、というのは良い収穫でした。極力、警告抑止はない方がいいですが、使う場合はなるべく小さなスコープで書くようにしたいと思います。
今回は以上です。では。
0 件のコメント:
コメントを投稿