C - и исторический C ++, прежде чем он назывался C ++ - требует, чтобы вы либо вручную расширяли «универсальные» типы в неуниверсальные (то есть макрос-препроцессор C, эквивалентный шаблонам C ++), либо экранировали систему типов (т.е. указатели void) .
Однако массивы (списки) обрабатываются как составные типы, а не как один тип. Например, у вас может быть массив шорт, но вы не можете обращаться с ним так же, как с массивом символов или даже с длинными.
Это не очень большая проблема в C, хотя иногда это неудобно. Это представляет собой компромисс 40 лет назад, чтобы выразить это в контексте.