2016-05-25 4 views
2

このプログラム考えてみましょう:VS2015との#pragma(無効:XXXX)が期待どおりに動作しません(スコープ号)

#include <string> 
#include <boost/random.hpp> 

int main(int argc, char *argv[]) 
{ 
    return 0; 
} 

Compilexを、私はランダム\詳細\のpolynomial.hppファイル\ブーストから4996の警告を受けます。

d:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility(2810): warning C4996: 'std::_Fill_n': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' 
    d:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility(2797): note: voir la déclaration de 'std::_Fill_n' 
    d:\dev\vobs_ext_2015\libcpp\boost\1.60.0\boost\random\detail\polynomial.hpp(114): note: voir la référence à l'instanciation de la fonction modèle '_OutIt std::fill_n<boost::random::detail::polynomial_ops::digit_t*,size_t,boost::random::detail::polynomial_ops::digit_t>(_OutIt,_Diff,const _Ty &)' en cours de compilation 
      with 
      [ 
       _OutIt=boost::random::detail::polynomial_ops::digit_t *, 
       _Diff=size_t, 
       _Ty=boost::random::detail::polynomial_ops::digit_t 
      ] 

は、だから私は警告を無効にしてみました:

#pragma warning(push) 
#pragma warning(disable: 4996) // disable warning coming from boost/random.hpp 
#include <string> 
#include <boost/random.hpp> 
#pragma warning(pop) 

int main(int argc, char *argv[]) 
{ 
    return 0; 
} 

そして今、それがなくなって...なぜ私は:

#include <string> 

#pragma warning(push) 
#pragma warning(disable: 4996) // disable warning coming from boost/random.hpp 
#include <boost/random.hpp> 
#pragma warning(pop) 

int main(int argc, char *argv[]) 
{ 
    return 0; 
} 

警告が報告さ....その後、私が試したままプラグマのpush/popディレクティブ内に#include <string>が必要ですか?

+0

どのバージョンのBoost? –

+0

@MarcusMüller:1.60。 – jpo38

+0

警告を逐語で追加した場合は、本当に便利です –

答えて

2

この警告は、内部ヘッダーファイル<xutility>からのものです。このファイルは、最初に<string>に含まれ、次に<boost/random.hpp>にも含まれています(2回目は無視される可能性があります)。この警告を表示しないようにするには、ヘッダーが最初に含まれているときに、この警告を表示しないようにする必要があります。

その奇妙な警告はとにかくです。その呼び出しが潜在的に危険な可能性があると言っているだけですが、実際には安全ではないことをコンパイラーは教えてくれません。警告が言うと、あなたのプロジェクト設定で定義_SCL_SECURE_NO_WARNINGSを使用して、それをオフにしてあなたは、単に行うことができます(あるいはあなたがその使用する場合は、任意のヘッダや、あなたのPCHに含ま前)jpo38によって

編集:

をこれは警告を削除します。

#pragma warning(push) 
#pragma warning(disable: 4996) // disable warning coming from boost/random.hpp 
#include <boost/random.hpp> 
#pragma warning(pop) 

#include <string> 

だから、問題は<xutility><boost/random.hpp><string>の両方に含まれているから来ている事実です。 <xutility>は複数のインクルード(#pragma once)から保護されているため、最初は<xutility>が含まれている間は警告4996を無効にする必要があります。

+0

あなたの投稿を私のテストの結果で編集しました。あなたは正しかった。ありがとう。 – jpo38

関連する問題