Что отвечает за обеспечение того, чтобы все символы были известны / определены? - PullRequest
0 голосов
/ 01 декабря 2011

Это препроцессор, компилятор или редактор связей C ?

Ответы [ 4 ]

3 голосов
/ 01 декабря 2011

Сказать по правде, это программист.

0 голосов
/ 01 декабря 2011

Программист должен убедиться, что все где-то определено.Программист несет ответственность за это.

Различные инструменты будут жаловаться по пути, если они заметят, что чего-то не хватает:

Компилятор заметит, что некоторые вещи отсутствуют, и выдаст ошибку, если поймет, что чего-то нет.

Компоновщик выдаст ошибку, если не сможет исправить ссылку, которой нет в библиотеке.

Во время выполнения есть загрузчик, который вытягивает соответствующие общие библиотеки в область памяти процесса.Загрузчик - это последнее, что получает трещину при исправлении символов перед тем, как программа запускает какой-либо код, и выдает ошибки, если не может найти разделяемую библиотеку / dll или если используется интерфейс для библиотеки, которая использоваласьвремя компоновки не совпадает корректно с доступной библиотекой.

Ни один из этих инструментов НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ за то, что все определено.Это просто те вещи, которые заметят, если что-то НЕ определено, и те, которые выдают сообщение об ошибке.

0 голосов
/ 01 декабря 2011
  • Для символов с внутренней связью или без связи: компилятор.
  • Для символов с внешней связью: компоновщик, либо «традиционный», либо компоновщик времени выполнения.

Обратите внимание, что динамический компоновщик / динамический компоновщик может выполнять свою работу лениво, разрешая символы только при их использовании (например, когда функция вызывается в первый раз).

0 голосов
/ 01 декабря 2011

Ответ, который вы ищете ... компилятор это зависит . Иногда это компилятор, иногда компоновщик, а иногда этого не происходит, пока программа не загружена.


Препроцессор :

обрабатывает директивы для включения исходного файла (#include), определения макросов (#define) и условного включения (#if).
...
Язык директив препроцессора не зависит от грамматики C , поэтому препроцессор C также может использоваться независимо для обработки других типов текстовых файлов.

Линкер :

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

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

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

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

В средах, которые позволяют динамическое связывание , возможно, что

исполняемый код по-прежнему содержит неопределенные символы, а также список объектов или библиотек, которые предоставят определения для них.

...