Прямая ссылка против прямой декларации - PullRequest
11 голосов
/ 30 марта 2009

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

Ответы [ 3 ]

28 голосов
/ 22 января 2012

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

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

5 голосов
/ 30 марта 2009

Из Википедия :

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

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

Ссылка вперед

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

3 голосов
/ 30 марта 2009

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

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

...