忠告には用心せよ。この忠告に対してもだ。
Beware of advice - even this.
プログラムを組んでいるとどうしてもちょっとしたミスタイプをしてしまいます。変数名や関数名の間違いのようなものであれば、コンパイルエラーになってすぐ修正すれば終わりです。しかし、中にはコンパイルが通ってしまうというものもあり、実行時にバグを引き起こしてしまうことがあります。
例えば、よくある==と=の間違い。
if (flag = 1) {
...
}
val = 1は1を返す式として評価されるので、C/C++上の文法は満たしていますが、大抵の場合、これは、「flag == 1」の間違いでしょう。
これは、普段から「1 == flag」と定数値の方を左辺に持ってくるくせをつけているとある程度防げます。とはいえ、この方法は両辺が変数であったりすると使えないのと、可読性が低くなりがちなので敬遠されることもあります。もうひとつよくあるミスタイプ別の例をあげると、switch分のdefaultのタイプミスです。
switch (char_type) {
case ALPHA:
printf("this is alphavet\n");
break;
case NUM:
printf("this is numeric\n");
break;
defualt:
printf("this is unknown character\n");
break;
}
defaultとかくべきところをdefualtと書いてしまっています。一見、コンパイルエラーになりそうな気もしますが、実際は、defualtはラベルとして認識されるため文法的にはエラーになりません。もちろん、動作は期待通りにはいきませんので、当然バグになります。さて、これらのちょっとしたスペルミスはよくあるバグの原因ではありますが、コンパイラのwarningをチェックしていれば大抵気付くようなものです。大抵のコンパイラであれば、上記のような記述は文法的には正しいとは言え、ミスタイプの可能性が高いものとしてwarningを出してくれます。よって、コンパイル時にwarningに気を使うくせをつけておけば、すぐに修正して終わるようなものなのです。
プロジェクトによっては、コーディング規約で全てのwarningをなくすようにというところもあると思いますが、そうでなくても、普段からコンパイラからの警告には耳を傾けるようにしましょう。
【関連記事】
・使用しない仮引数
【関連リンク】
・C/C++バグ防止: defaultのスペルミスに気をつけろ!
・明解プログラミングのすすめ (Cプログラミングの秘訣)
【関連書籍】
・ライティングソリッドコード―バグのないプログラミングを目指して スティーブ・マグワイア
・C++プログラミングの処方箋―ひと味違うコードを書くための99の鉄則
・プログラミング作法 ブライアン・カーニハン
| ホーム |










