На языке C ++ вы не можете просто сделать
int Array[][100]; /* ERROR: incomplete type */
потому что это будет определение объекта неполного типа, что явно недопустимо в C ++. Вы можете использовать это в неопределяемой декларации
extern int Array[][100];
(или как статический член класса), но когда дело доходит до фактического определения одного и того же объекта массива, оба размера должны быть указаны явно (или получены из явного инициализатора).
В C ситуация не сильно отличается, за исключением того, что в C есть такие вещи, как предварительные определения , которые позволяют писать
int Array[][100];
Тем не менее, предварительное определение в этом отношении очень похоже на неопределенное объявление, поэтому оно разрешено. В конце концов вам придётся определить один и тот же объект с явно заданным размером в одной и той же единице перевода (некоторые компиляторы не требуют этого как нестандартное расширение). Если вы попробуете что-то подобное в не предварительном определении, вы получите ошибку
static int Array[][100]; /* ERROR: incomplete type */
Итак, если вы подумаете об этом, кроме предварительных определений, ситуация в C и C ++ не сильно отличается: недопустимо определять объекты неполного типа в этих языках, а массив неопределенного размера является неполным типом.