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