A предварительное объявление - это объявление метода или переменной перед ее реализацией и использованием. Цель предварительных объявлений - сэкономить время компиляции.
Предварительное объявление переменной приводит к тому, что пространство для хранения откладывается, поэтому вы можете позже установить значение этой переменной.
Прямое объявление функции также называется «прототипом функции» и является оператором объявления, который сообщает компилятору, что является типом возвращаемой функции, каково имя функции, и типы ее параметров. Компиляторы на языках, таких как 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 # идентификаторы автоматически распознаются из исходных файлов и считываются непосредственно из символов динамической библиотеки. В этих языках заголовочные файлы не нужны по той же причине.
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);
}
Обратите внимание, что иногда "прямая ссылка" используется, хотя и не так часто, как синоним "объявления вперед".