« どっち派? | トップページ | 整理整頓 »

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>()を展開しようとしますが、そんなものの実体は無いため、その場所でコンパイルエラーとなって、教えてくれます。

まぁ、限られた場所でしか使えないかもしれませんが、しょうもないミスは防げると思うので、興味のある方は使ってみてはいかが?

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2008/06/post_5155.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« どっち派? | トップページ | 整理整頓 »

プログラマー」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: 静的な変数に対するエラーチェック:

« どっち派? | トップページ | 整理整頓 »