2008年6月 3日 (火)静的な変数に対するエラーチェック
おはようございます。 本日の当番、プログラマのT.Yです
複数人数での開発を行う上で、どうしても人間同士なので、連絡が伝わらなかったり、
そもそも人間なので、ミスを犯したりしてしまいます。
そこで、ミスなどによって発生するであろうバグを未然に回避するために、いろいろとエラーチェックを設けるわけです。
普通は実際に実行して、その処理通過時に、渡された値が意図した範囲の値であるかなどのチェックを行い、その先の処理に対して意図しない値が送られてきた場合は、そこでプログラムを停止したりする処置を行うわけです。
ただし、これでは実際に実行して、尚且つその処理を通過しなければなりません。
そこで、より早い段階で検出できれば・・・ たとえば、コンパイルの段階で。
今回はそんなエラーチェックを行う紹介をしようと思います。
最近自分で作ったもので言えば、こんなもの。
template< bool bFlag > void TStaticAssert(void);
template<> void TStaticAssert<true>(void){}
#define SASSERT( a ) TStaticAssert< (a!=0)?true:false >()
これは、SASSERT( a ) の「a」の部分が真であれば、特殊化されて実装されている、TStaticAssertが展開され、
問題なくコンパイルに成功しますが、偽の場合は、実体が無いため、展開に失敗して、エラーとなります。
ただし、当然ですが、この条件はコンパイル時にすでに決定していなければなりません。
そんなものどこで使うの? と思うかもしれませんが、とりあえず簡単に一例を挙げてみましょう。
たとえば、Aというソースの中にある、int iDataArrayA[8];という配列。
そして、Bというソース内にある、int iDataArrayC[8];。
自分がBを担当し、A内のiDataArrayを自分の持っているiDataArrayにコピーしたいとします。
普通にただ単にコピーするだけなら、 memcpy( iDataArrayC, iDataArrayA, sizeof( iDataArrayC ) );で済むと思います。
この後、自分に対して何にも連絡ひとつ無く、Aを書いた人が勝手に配列のサイズを変えてしまった場合。
考えたくもありません。
それを防ぐものとして、 SASSERT( sizeof(iDataArrayA) == sizeof(iDataArrayC) ) を付近におきます。
これは、iDataArrayAとiDataArrayCのサイズが等しければ「真」となりTStaticAssert<true>()が展開され、正常にコンパイルされます。
そしてこの2つのサイズが変わった場合は、TStaticAssert<false>()を展開しようとしますが、そんなものの実体は無いため、その場所でコンパイルエラーとなって、教えてくれます。
まぁ、限られた場所でしか使えないかもしれませんが、しょうもないミスは防げると思うので、興味のある方は使ってみてはいかが?
| 固定リンク | コメント (0) | トラックバック (0)
「プログラマー」カテゴリの記事
- 技術交流の業(2019.03.07)
- 福袋争奪戦デビュー(2019.01.31)
- 温泉旅行(2019.01.24)
- ゲーセンの近況(2018.11.29)
- 健康的にプログラミングを続けるためのちょっとした習慣(2018.10.18)
コメント