警告とは、「これを実行すると、もしかしたら変な動作をしたり、動かなくなったりするけど、いいですか?」と注意してくれるものです。
例えば、下のプログラムを見てください。
<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に設定してください。
エラーについてはこちらをご覧ください。
ブラウザの戻るボタンで戻ってください。