Вопрос

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

Это было полезно?

Решение

От Википедия:

Форвардная декларация

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

Прямая ссылка

Аналогично форвардному объявлению, но там, где переменная или функция появляется первой, определение также присутствует.

Другие советы

А форвардная декларация — это объявление метода или переменной перед его реализацией и использованием.Цель форвардных объявлений — сэкономить время компиляции.

Предварительное объявление переменной приводит к выделению места для хранения, чтобы вы могли позже установить значение этой переменной.

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

Предварительное объявление — это подсказка компилятору, что вы определили (заполнили реализацию) функцию в другом месте.

Например:

int first(int x); // forward declaration of first

...

int first(int x) {
   if (x == 0) return 1;
   else return 2;
}

Но вы спросите, почему бы нам просто не заставить компилятор выполнять два прохода для каждого исходного файла:первый для индексации всех символов внутри, а второй для анализа ссылок и их поиска?По словам Дэна Стори:

Когда C был создан в 1972 году, вычислительные ресурсы были гораздо более скудными и на высокой премии - память, необходимую для хранения всей символической таблицы сложной программы одновременно, просто не была доступна в большинстве систем.Фиксированное хранилище было также дорогим и чрезвычайно медленным, поэтому такие идеи, как виртуальная память или хранение частей символической таблицы на диске, просто не позволили бы компиляцию в разумные сроки ...Когда вы имеете дело с магнитной лентой, где время поиска измерялось за считанные секунды, а пропускная способность измерялась в байтах в секунду (не килобиты или мегабайты), это было довольно значимым.

C ++, будучи созданным почти 17 лет спустя, был определен как суперсет C, и поэтому должен был использовать тот же механизм.

К тому времени, когда Java прокатилась в 1995 году, средние компьютеры имели достаточно памяти, что удержание символической таблицы, даже для сложного проекта, больше не было существенным бременем.И Java не была разработана так, чтобы быть обратно совместимой с C, поэтому ей не нужно было принять устаревший механизм.C# также не был обременен.

В результате их дизайнеры решили сместить бремя компартментализирующей символической объявления от программиста и снова поставить его на компьютер, поскольку его стоимость пропорционально общей усилиям компиляции была минимальной.

В Java и C# идентификаторы распознаются автоматически из исходных файлов и считываются непосредственно из символов динамической библиотеки.На этих языках файлы заголовков не нужны по той же причине.

А прямая ссылка это наоборот.Это относится к использованию объекта до его объявления.Например:

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);
}

Обратите внимание, что «упреждающая ссылка» иногда, хотя и реже, используется как синоним «упреждающего объявления».

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top