2016-01-27 17 views
5

C4800警告ここで説明したように:「 'タイプ':「真BOOLする値を強制的にC4800には実際の値がありますか?マイクロソフトのC++コンパイラで

// C4800.cpp 
// compile with: /W3 
int main() { 
    int i = 0; 

// try.. 
// bool i = 0; 

    bool j = i; // C4800 
    j++; 
} 

C4800警告を投げる:

https://msdn.microsoft.com/en-us/library/b6801kcy.aspx

は、このコードが作ります'または' false '(パフォーマンスの警告) "

マイクロソフトは、それが合理的に重要であると考えているようですが、レベル3の警告としていますが、Clangは明らかにそうではないと思っています。それについてのints - あらゆるもの、その最大の警告レベル。

C4800が有効にする価値があると指摘している現実のバグはありますか?

+2

は言葉遣いを読む

ので、問題は、私たちが実際に比較した結果でjを割り当てるために欲しかったものかどうかであります: "パフォーマンス警告"。これは、あなたが予想していたよりもいくらか遅い/より高価かもしれないと警告しています。 –

+3

パフォーマンスの低下もバグです:)この警告で指摘されているような不快なパフォーマンスの低下がある現実の世界を考えることはできますか? –

+1

まだ見つからない場合は、[この質問](http://stackoverflow.com/questions/206564/what-is-the-performance-implication-of-converting-to-bool-in-c)を参照してください。あなたに興味を持ってください。最初の答えは、「パフォーマンスの警告」が警告が意図しているものではないことを示しているようです。 – jaggedSpire

答えて

3

これは基本的に、他の整数型をboolに変換したことを警告しているだけで、この変換は完全にフリーではありません。

boolを他の整数型と混同していることを警告するのはほとんどの場合です(少なくとも私が物事を見ているように)。これはパフォーマンスのわずかな低下につながるだけでなく、コードの混乱を示唆することもあります。問題のコードを見てみると:

int i = 0; 

// try.. 
// bool i = 0; 

    bool j = i; // C4800 
    j++; 

...私たちはが以前のタイプintであるとjを定義されたいくつかのコードの不完全な変換のように見えます持っているもの。 jの定義は既に編集されており、タイプはboolですが、まだintの値が割り当てられています(さらに悪い)、ポストインクリメントを使用しています。jのタイプがint実際にはのjではありません。同様booliを回すでしょうbool j = (i != 0);または多分より完全な変換:

bool i = false; 

// ... 
bool j = i; // no warning 

j = true; // cleaner way of producing the same result as the post-increment. 
関連する問題