★警告とエラー★


警告(Warning)


警告とは、「これを実行すると、もしかしたら変な動作をしたり、動かなくなったりするけど、いいですか?」と注意してくれるものです。

例えば、下のプログラムを見てください。


<sample program col010-01>

#include <stdio.h>

int main(void)
{
    int data1;

    double data2 = 3.8;

    data1 = data2;

    printf("%d\n", data1);

    return 0;
}

<コンパイル結果>

  warning C4244: '=': 'double' から 'int' への変換です。データが失われる可能性があります。

<実行結果>

3
続行するには何かキーを押してください・・・

コンパイルした時に、警告が表示されています。

double型(実数)からint型(整数)への変換(代入)ですから、小数点以下が切り捨てられ、データが失われる可能性があると注意してくれています。

可能性がある、というのは、1.0や2.0といった小数点以下がゼロの場合は、失うデータが無いためです。

しかし、良く見てみると、実行は出来ています

後述しますが、コンパイル時にエラーになったものは実行出来ません。

なぜ実行出来るのかを上のプログラムを例に取って説明すると、「小数点以下の切捨てを行いたいので、わざとint型に代入する」ことがあるからです。

ただ、「少数以下の切捨てを行いたくないのに、間違って代入した」可能性もあります。

どちらか、判断できないので、「警告」しているわけです。


ところで、警告は表示されていても実行できるため、放置しておいても良いものなのでしょうか?

実際には、警告もエラーと同じ扱いになるケースの方が多いです。

上にも書きましたが、「わざとint型に代入する」ケースより「間違って代入した」というケースの方が多いということです。

例えば、次の例を見てください。


<sample program col010-02>

#include <stdio.h>

int main(void)
{
    int data = 5;

    if (data = 8) {
        printf("OK\n");
    }

    return 0;
}

<実行結果>

OK
続行するには何かキーを押してください・・・

これは、if文の時に説明しました。

  「=」演算子は、代入という意味であり、等しいという意味ではないけれど、最初のうちは、if文の条件で間違って使ってしまうケースがあり、警告も出ないため、非常に気づきにくいエラーになる。

というやつです。

実は、この間違いは「警告レベル」を上げることで、気づくことが出来るようになります。


警告レベル


警告レベルの上げ方を説明します。

プロジェクトメニュー → ○○のプロパティ(一番下にあります)


プロパティ

構成プロパティ → 全般 → 警告レベル


デフォルトは「レベル3」です。

レベル4に変更します。


レベル4

OKボタンを押します。


これで、同じプログラムをコンパイルすると、

<コンパイル結果>

  warning C4706: 条件式の比較値は、代入の結果になっています。

という警告が表示されるようになります。


つまり、「警告」は実行可能であり、エラーではないのですが、プログラマが「理解している上でわざとやっている」警告なのか、「間違い」なのかはっきりさせてください、という「警告」なのです。

では「わざとやっている」場合、警告は残したままで良いのでしょうか?

基本的には、「警告」も「エラー」も全て無くしてしまう方が良いです。

その場合の対処方法は、ずっと後で説明します。

とりあえず、プロジェクトを新規作成した場合、まず警告レベルを4に設定してください。


エラー(Error)


エラーについてはこちらをご覧ください。


ブラウザの戻るボタンで戻ってください。