Прямая ссылка на форвардную декларацию

Немного смущен. В чем разница между форвардной декларацией и прямой ссылкой? Передовая декларация в моей голове, когда вы объявляете функцию, которая еще не реализована, но является ли это неправильным? Вам нужно взглянуть на указанную ситуацию для объявления "прямой ссылки" или "прямой декларации"?

Ответ 1

От Wikipedia:

Переслать декларацию

Объявление переменной или функции, которые еще не определены. Их разборку можно увидеть позже.

Справочная ссылка

Подобно Forward Forward, но там, где сначала появляется переменная или функция, определение также находится на месте.

Ответ 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".

Ответ 3

forward декларации используются для однопроходной компиляции языка (C, Pascal).

если прямые ссылки разрешены без прямого объявления (Java, С#), требуется двухпроходный компилятор.