3

C ++コードをコンパイルするには、-Wフラグを使用します。これにより、警告が発生します。

警告:符号なし式の比較<0は常にfalseです

これはバグと見なされ、バージョンGCC 4.3で修正されたと思いますが、GCC4.1を使用しています。

ここで明らかに不快なコード:

void FieldGroup::generateCreateMessage (const ApiEvent::GroupData &data, omsgstream &result) const {
  dblog << debug;

  // Write out the data fields we care about, in the order they were specified
  for (size_t index = 0; index < fields.size(); ++index) {
    size_t esIndex = clsToES[index];
    if (esIndex < 0 || esIndex >= data.fields.length()) {
      ostringstream buf;
      buf << "Invalid field " << index << " (index in ES data set " << esIndex << ", " << data.fields.length() << " fields returned)";
      throw InvalidDataException (buf.str());
    }
    fields[index].writeData (data.fields[esIndex], result);
  }
}

警告が表示されます:

dbtempl.cpp:メンバー関数内'void ECONZ :: FieldGroup :: generateCreateMessage(const nz :: co :: econz :: eventServer :: ApiEvent :: GroupData&、ECONZ :: omsgstream&)const':dbtempl.cpp:480:警告:符号なし式の比較<0は常にfalseです

これらの警告が表示されないようにするにはどうすればよいですか?-W旗を外したくない。

4

4 に答える 4

19

正の値が0未満であるかどうかをテストしています。

Asize_tは符号なしなので、少なくとも0です。

これは決して起こり得ず、コンパイラはテストを削除するだけで物事を最適化します。警告は、誰かがそれをした場合、それは間違いである可能性があるため、あなたに伝えるためにここにあります。

あなたの場合、あなたはただテストを削除するかもしれません、それは大丈夫なはずです。

于 2010-08-30T07:19:10.910 に答える
6

size_t符号なし積分型です。したがって、コンパイラは、比較< 0が常にfalseになることを認識します(オーバーフローが発生した場合、標準では2の補数の折り返しが指定されています)。それは何もしないので、その比較を取り除く必要があります(そしてコンパイラはおそらくそれのためのコードを生成しません)。

符号なしで宣言された符号なし整数は、2nを法とする算術の法則に従うものとします。ここで、nは、その特定のサイズの整数の値表現のビット数です。46

および対応する脚注:

46)これは、結果の符号なし整数型で表現できない結果が、結果の符号なし整数型で表現できる最大値より1大きい数を法として減少するため、符号なし算術がオーバーフローしないことを意味します。

于 2010-08-30T07:21:02.653 に答える
3

キャラクターを奪うesIndex < 0 ||

コードのこの部分は、マシンにとってまったく意味がありません。そのため、コンパイラは「何か他のことをするつもりでしたか?」と警告します。

于 2010-08-30T07:19:34.603 に答える
-1

これらの警告が表示されないようにするにはどうすればよいですか?-Wフラグを削除したくありません。

:|

コードを修正するだけで警告が消えます...それがアイデアです...

警告は、正しく、よりクリーンで、より効率的なコードを作成するのに役立ちます。

于 2010-08-30T07:27:24.103 に答える