コンパイル時のワーニング(-Wallと-Werror)(2) [プログラマー現役続行]
プログラミングの伝承としてif文の中で変数をある特定の値と比較する際に、その特定の値を
gcc/g++では、
※1 C++では、ポインターを0と比較することは容認されています。
※2 私自身は、
==
の左に書いて、変数を右に書くというものがあります。たとえば、C++であれば、このように書く理由として、if (0 == ptr) { // ... }
==
とタイプすべきところを間違って=
と書いてもコンパイラがエラーにしてくれるからだと説明されます。しかし、上記の書き方は、プログラムを読む際には、「0
はptr
か」と読むことになり、意味としておかしいものとなります。本来なら素直にptr == 0
と書いて、「ptr
は0
か」と読み手に読ませるべきです。※1gcc/g++では、
-Wall
をコンパイルオプションで指定すれば、ptr = 0
と間違って書いたとしても、次のように警告します。warning: suggest parentheses around assignment used as truth value当然、
-Werror
を指定すれば、コンパイルは中止されます。つまり、C/C++でGNUコンパイラを使用する環境では、-Wall -Werror
を標準でコンパイルオプションにしておけば、意味的におかしいコーディングをする必要がなくなります。※2※1 C++では、ポインターを0と比較することは容認されています。
NULL
が(void *) 0
と定義されている場合には、NULLと比較するとコンパイルエラーになるためです。※2 私自身は、
==
と書くべきところを=
と書いてしまった経験は、記憶にある限りではありません。でも、おそらく、プログラミング初心者の場合には、間違って書いてもおかしくはないかと思います(覚えていないだけで、ひょっとしたら若い頃には私も間違って書いてデバッグに苦労したことがあるのかもしれませんが)。2011-06-13 05:18
nice!(0)
コメント(1)
トラックバック(0)
そもそも、開発の初期からデバッグ版では -Wall -Werror を付けて開発を進めることで「コンパイラが見つけてくれる程度の不具合」は回避できると思います。
そして、例にあるコードこそ、可読性が下がる理由でレビュー時に指摘されるべきだと思います。
if (0 == ptr) {
// ...
}
by haruomi (2011-06-18 23:55)