変数xが以下のコードスニペットで定数として宣言されている場合、clang 2.9とg ++ 4.1.2の両方で警告が生成されます。しかし、のconstが削除された場合、スニペットに記載されているように、私が知っている以下のパラメータで実行しても警告は生成されません。 "-Wall -Wextra -pedantic -ansi"const以外の変数をより小さな型の変数に代入して切り捨てるときに、g ++やclangが警告を出さないのはなぜですか?
xはvolatileではなく、型変換の前に変更することはできないため、コンパイラは同じ警告を推測して報告しません。
#include <iostream>
int main(int argc, char **argv)
{
unsigned int x = 1000;
const unsigned char c = x;
const unsigned int x_ = c;
std::cout << "x=" << x << " x_=" << x_ << std::endl;
return 0;
}
とすると、符号なし整数x = 1000; g ++は、メッセージ「警告:暗黙的に符号なしタイプに切り捨てられました」とメッセージ「」を提供します。警告:「const unsigned int」から「const unsigned char」への暗黙的変換により、値が1000から232に変更されます[-Wconstant-conversion] "。
手動でコードを検査したり、正しく設計された単体テストに頼ったりしなければ、このケースを自動的に検出する方法はありますか?
優秀、ありがとう!どうしてそれはWextraには含まれていないのですか?私はWextraが壁に収まらないものすべてを捕まえたと思った。 –
私は分かりません。それは-Wextraの一部でなければなりません(私は実際に-Wallの一部でなければならないと思います)。 –
@David:残念なことに '-Wextra'はキャッチオールではありません。アフガニスタンには、gccやclangには、すべてを活性化させる旗がありません。 –