C - очень старый язык. Когда это были изобретены компьютеры, где медленно и было очень мало памяти, питания процессора и даже дискового пространства. Время процессора также стоит настоящих денег. Необходимость включать заголовки, анализировать их и запоминать все объявленные функции - это стоило бы с реальными затратами.
Таким образом, чтобы упростить вещи, компилятор просто предполагал, что если вы вызываете функцию, эта функция будет существовать и принимать типы аргументов, которые вы используете при вызове и которые возвращают int. Это «неявная декларация». Простой вызов функции неявно объявляет ее. Эта функция существует и по сей день.
Так что это не так много, что компилятор каким-то образом видит эти защищенные / частные функции, но просто и вслепую предполагает, что они существуют, и, к удивлению, когда вы позже связываете объектные файлы вместе, они делают .
Проверьте документацию вашего компилятора о том, как превратить это предупреждение в ошибку. Хотя это абсолютно законно, это очень опасная функция (неявное объявление пропускает любые проверки типов по своей природе и завершается ошибкой из-за того, что ничего не возвращается), и вы действительно не должны использовать эту функцию в настоящее время. Сбой компиляции, когда кто-то пытается его использовать, выглядит так, как вы хотите.