При чтении некоторых ответов на этот вопрос я начал задаваться вопросом, почему компилятор действительно должен знать о функции, когда она впервые встречает его. Не было бы просто просто добавить дополнительный проход при разборе компиляционной единицы, которая собирает все символы, объявленные внутри, так что порядок, в котором они объявлены и используются, больше не имеет значения?
Можно утверждать, что объявление функций до их использования, безусловно, является хорошим стилем, но мне интересно, есть ли другая причина, почему это обязательное в С++?
Изменить - пример для иллюстрации: Предположим, что вам нужны функции, которые определены внутри строки в файле заголовка. Эти две функции вызовут друг друга (возможно, рекурсивный обход дерева, где нечетные и четные слои дерева обрабатываются по-разному). Единственный способ разрешить это - сделать прямое объявление одной из функций перед другой.
Более распространенный пример (хотя и с классами, а не с функциями) относится к классам с конструкторами и фабриками private
. factory должен знать класс, чтобы создавать экземпляры его, и класс должен знать factory для объявления friend
.
Если это требование с древних времен, почему оно не было удалено в какой-то момент? Это не сломает существующий код, не так ли?