SSブログ

コンパイル時のワーニング(-Wallと-Werror)(2)  [プログラマー現役続行]

プログラミングの伝承としてif文の中で変数をある特定の値と比較する際に、その特定の値を==の左に書いて、変数を右に書くというものがあります。たとえば、C++であれば、
if (0 == ptr) {
     // ...
}
このように書く理由として、==とタイプすべきところを間違って=と書いてもコンパイラがエラーにしてくれるからだと説明されます。しかし、上記の書き方は、プログラムを読む際には、「0ptrか」と読むことになり、意味としておかしいものとなります。本来なら素直にptr == 0と書いて、「ptr0か」と読み手に読ませるべきです。※1

gcc/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 私自身は、==と書くべきところを=と書いてしまった経験は、記憶にある限りではありません。でも、おそらく、プログラミング初心者の場合には、間違って書いてもおかしくはないかと思います(覚えていないだけで、ひょっとしたら若い頃には私も間違って書いてデバッグに苦労したことがあるのかもしれませんが)。

nice!(0)  コメント(1)  トラックバック(0) 

nice! 0

コメント 1

haruomi

そもそも、開発の初期からデバッグ版では -Wall -Werror を付けて開発を進めることで「コンパイラが見つけてくれる程度の不具合」は回避できると思います。

そして、例にあるコードこそ、可読性が下がる理由でレビュー時に指摘されるべきだと思います。
if (0 == ptr) {
// ...
}
by haruomi (2011-06-18 23:55) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0