Я не очень понимаю смысл примера, но обычно руководствуюсь простым соображением - по мере возможности использовать доступные в языке атрибуты объекта (переменной). С этой точки зрения
Код:
#define SZ 10
char c[SZ];
...
int x = SZ;
хуже, чем
Код:
char c[10];
...
int x = sizeof(c);
Причина проста - в языке нет
органической связи между SZ и с. В момент написания программы можно все помнить и отладить, но через три года другой человек может что-либо нарушить. Меня очень огорчает то, что нельзя написать
Код:
T x;
...
typeof(x) y = x; // typeof(x) == typeof(y) == T
поскольку это давало бы гарантию правильности типа y (например, там, где y - временная копия x) вне зависимости от изменения типа x в будущем.
Все это особенно играет, когда T по каким-то причинам раcщепляется на T и Т1 (например, выведенный из T), и надо решить по всей большой программе, где надо менять. В этом случае правильность соотвествия заданная через общий внешний идентификатор может нарушиться.
В некотором смысле, это можно рассматривать как распространение объектно- ориентированного подхода на время разработки и компиляции.