2004/12/22
_ プログラミング
C言語で配列を使う場合、素直に書くとこんな感じ。(パターン1)#define MAX_BLOCKS 10 char blk[MAX_BLOCKS]; for(i = 0; i < MAX_BLOCKS; i++){ blk[i] = ... }
MAX_BLOCKSは、変数の要素数であるという保証は無いわけで、安全を考慮するとこんな感じ。(パターン2)
#define MAX_BLOCKS 10 #define NELEMS(array) (sizeof(array) / sizeof((array)[0])) char blk[MAX_BLOCKS]; for(i = 0; i < NELEMS(blk); i++){ blk[i] = ... }自分はなるべくパターン2で書いてます。だけど、安全性はともかく可読性が低いような気がします。 可読性が下がると逆にバグを作りそうで、迷わしいところです。 同要素数の2個以上の配列をペアで扱う場合は、妥協してパターン1のやり方で…。
#define MAX_BLOCKS 10 char blk_A[MAX_BLOCKS]; char blk_B[MAX_BLOCKS]; for(i = 0; i < MAX_BLOCKS; i++){ blk_A[i] = blk_B[i]; }でも、どちらか一方のパターンに統一したい…。(考えすぎ?)
MAX_BLOCKSが要素数と限らなくなる可能性というのは保守の<br>結果として生じるものと思うけど、<br>マクロ化するとそれとは別にマクロに保守を要しますな。<br>せめて明示的なネーミングにするとか、マイマクロとして<br>どっかで集約して保守するとかしないと別の問題が生じるかと。<br>(MASMのマクロライブラリ見たいな感じか)
ぼくは、下記のようにしてましたね。<br>#define MAX_BLOCKS10 10
最近はあまりマクロを使わないようにする傾向があるみたいですね。(副作用etcなどで)<br>shirouさんの書き方だと意味が通じやすいけど、将来要素数の変更があったときにマクロ名の変更まで必要になるので辛いかもです。
ところで、mallocの返したポインタにアクセスする場合も_msizeの戻り値で領域チェックをするべきでしょうか。
ネタですか?