Немного смущен. В чем разница между форвардной декларацией и прямой ссылкой? Передовая декларация в моей голове, когда вы объявляете функцию, которая еще не реализована, но является ли это неправильным? Вам нужно взглянуть на указанную ситуацию для объявления "прямой ссылки" или "прямой декларации"?
Ответ 2
A forward декларация - это объявление метода или переменной перед его внедрением и использованием. Цель форвардных объявлений - сохранить время компиляции.
Вперед декларацию переменной приводит к тому, что пространство памяти следует отложить, поэтому вы можете позже установить значение этой переменной.
Перспективное объявление функции также называется "прототипом функции" и является объявлением, которое сообщает компилятору, что такое тип возвращаемых функций, каково имя функции и типы ее параметров. Компиляторы на таких языках, как C/С++ и Pascal, хранят объявленные символы (включая функции) в справочной таблице и ссылаются на них, когда они попадают в них в ваш код. Эти компиляторы читают ваш код последовательно, то есть сверху вниз, поэтому, если вы не пересылаете объявление, компилятор обнаруживает символ, который он не может ссылаться в таблице поиска, и вызывает ошибку, которую он не знает как реагировать на функцию.
Вперед объявление является подсказкой для компилятора, который вы определили (заполнили реализацию) функцию в другом месте.
Например:
int first(int x); // forward declaration of first
...
int first(int x) {
if (x == 0) return 1;
else return 2;
}
Но вы спрашиваете: почему бы нам просто не сделать компилятор двумя проходами в каждом исходном файле: первый для индексации всех символов внутри, а второй - для анализа ссылок и поиска их? Согласно Дэну Историю:
Когда C был создан в 1972 году, вычислительные ресурсы были намного более скудными и с высокой премией - память, необходимая для хранения комплекса программная целая символическая таблица сразу просто не была доступна в большинство систем. Фиксированное хранилище также было дорогостоящим и очень медленным, поэтому такие идеи, как виртуальная память или хранение частей символической таблицы на диск просто не позволил бы компиляции в разумных таймфрейм... Когда вы имеете дело с магнитной лентой, где время поиска измерялись в секундах, а пропускная способность считывания измерялась в байтах на второй (не килобайт или мегабайт), что было довольно значимым.
С++, созданный почти 17 лет спустя, был определен как надмножество от C, и поэтому пришлось использовать тот же механизм.
К тому времени, когда Java развернулась в 1995 году, средним компьютерам было достаточно память, содержащая символическую таблицу, даже для сложного проекта, была больше не является существенным бременем. И Java не был предназначен для обратно совместимый с C, поэтому ему не нужно было использовать наследие механизм. С# также не был ограничен.
В результате их дизайнеры решили перенести бремя отделив символическую декларацию от программиста и снова поставьте его на компьютер, поскольку его стоимость пропорциональна общее усилие компиляции было минимальным.
В Java и С# идентификаторы автоматически распознаются из исходных файлов и читаются напрямую из динамических символов библиотеки. В этих языках заголовочные файлы не нужны по той же причине.
A прямая ссылка - это противоположность. Это относится к использованию объекта перед его объявлением. Например:
int first(int x) {
if (x == 0) return 1;
return second(x-1); // forward reference to second
}
int second(int x) {
if (x == 0) return 0;
return first(x-1);
}
Обратите внимание, что "прямая ссылка" используется иногда, хотя и реже, как синоним "forward declaration".