Весь ваш вопрос показывает, что концепция «магических чисел» и правила, запрещающие использование «магических чисел» в вашей программе, абсолютно идиотичны. Правила против магических чисел - это плохое приближение людей, которые не понимают, что они делают, более разумного правила против жесткого кодирования в нескольких местах значений, которые должны совпадать или зависеть друг от друга. Например, этот код является вполне разумным, если длина буфера не должна соответствовать чему-либо еще в программе или реальном мире:
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
. В любом случае константы, фигурирующие в выражении, не являются «злыми магическими числами».
В вашем примере, если размерность массива зависит от какой-то другой переменной, то все три определения массива являются плохой практикой. Но если измерение 4 является фундаментальным для того, что вы делаете, я не вижу в этом ничего плохого.
Конечно, то, что вы делаете, может иногда меняться во время жизни кода, но для этого и нужна документация. Нельзя ожидать, что код справится с возможным возможным изменением цели в будущем без некоторого уровня модификации, и, пока вы задокументировали его первоначальное назначение и контракты, не должно быть трудным для кого-то, кто изменяет их, находить части кода это нужно изменить.