Вот еще одна перспектива: в C. нет единственного типа «массив». Скорее, T[N]
- это другой тип для каждого N
. Так что T[1]
, T[2]
и т. Д. - это все разных типов .
В C нет перегрузки функций, и поэтому единственно разумной вещью, которую вы могли бы разрешить, была бы функция, которая принимает (или возвращает) единственный тип массива :
void foo(int a[3]); // hypothetical
Предположительно, это считалось гораздо менее полезным, чем реальное решение сделать все массивы распадающимися в указатель на первый элемент и требовать, чтобы пользователь сообщал размер другими способами. В конце концов, вышесказанное можно переписать так:
void foo(int * a)
{
static const unsigned int N = 3;
/* ... */
}
Так что нет никакой потери выразительной силы, но огромный выигрыш в общности.
Обратите внимание, что в C ++ это ничем не отличается, но генерация кода на основе шаблонов позволяет написать шаблонную функцию foo(T (&a)[N])
, где для вас выводится N
, но это просто означает, что вы можете создать целое семейство различных, различных функций, по одной на каждое значение N
.
В крайнем случае представьте, что вам понадобятся две функции print6(const char[6])
и print12(const char[12])
, чтобы сказать print6("Hello")
и print12("Hello World")
, если вы не хотите распадать массивы на указатели или иначе вы ' Я должен добавить явное преобразование, print_p((const char*)"Hello World")
.