あなたの質問が示すのは、「マジック ナンバー」の概念と、プログラムで「マジック ナンバー」を使用することに対するルールが完全にばかげているということだけです。マジック ナンバーに対する規則は、自分が何をしているのかを理解していない人々による、一致しなければならない、または相互に依存する値を複数の場所にハードコーディングすることに対する、より健全な規則の不十分な概算です。たとえば、次のコードは、バッファー長がプログラムまたは実世界の他のものと一致する必要がない限り、完全に合理的です。
char buf[100];
snprintf(buf, sizeof buf, ...);
しかし、このコードは非常に悪いです:
char buf[100];
snprintf(buf, 100, ...);
もちろん、現実の世界では、おそらく特定のサイズの整数を出力するために必要な最大桁数など、バッファサイズを一致させたいことがあります。この場合、次のようなものが必要になる場合があります。
char buf[3*sizeof(int)+3];
snprintf(buf, sizeof buf, ...);
そして、CHAR_BIT
変数であると考える場合は、 3 を の式に置き換えたいと思うかもしれませんCHAR_BIT
。いずれにせよ、式に現れる定数は「邪悪な魔法の数字」ではありません。
あなたの例では、配列の次元が他の変数に依存している場合、3 つの配列定義はすべて悪い習慣です。しかし、次元 4 があなたがやっていることの基本であるなら、私はそれが間違っているとは思いません。
もちろん、あなたがしていることは、コードの存続期間中に変更されることがありますが、それがドキュメントの目的です。コードは、ある程度の変更なしに将来起こり得る目的の変更を処理することは期待できません。元の目的と契約が何であるかを文書化する限り、それらを変更した人がコードの部分を見つけるのは難しくありません。変更する必要があります。