2013-03-16 5 views
0

Мой основной вопрос: как работает процесс компиляции для использования стандартных библиотечных подпрограмм. Когда я #include <stdio.h> в C, препроцессор принимает всю стандартную библиотеку и вставляет ее в мой исходный файл?Как работает стандартная библиотека #include?

Если это так, когда я использую библиотечную процедуру, как это связано с компоновщиком?

+0

Чтобы дать вам подсказку, единственный способ не включать в себя компоновщик - это превратить скомпилированную программу в полную операционную систему. Помните, что некоторые вызовы функций - это вызовы функций, предоставляемых операционной системой; то есть открытие и чтение из файла. Стандартная библиотека не включает весь код, необходимый для этого; он делегирует фактическую работу ОС. – stakx

+0

В качестве упражнения просто создайте файл .c, который ** только ** содержит '#include ', скомпилируйте его (например, с помощью 'gcc -c file.c' и посмотрите на сгенерированный объект (возможно, с objdump). – wildplasser

ответ

2

Когда я включил фунт в C, препроцессор принимает всю стандартную библиотеку и вставляет ее в исходный файл?

Только файлы заголовков вы #include.

Если это так, когда я использую библиотечную процедуру, как это связано с компоновщиком?

В стандартных библиотечных заголовках содержатся только объявлений. Определение (реализация) функций находится в файле библиотеки, скорее всего /usr/lib/libc.ext (ext является зависимым от ОС расширением).

+1

В чем причина нисходящего потока? – 2013-03-16 17:15:14

1

Когда вы # включаете что-то в свой исходный код, препроцессор вставляет все, что вы #include в исходный файл. Но в частности, если вы включаете файл заголовка из библиотеки, вы просто включаете объявления функций, такие как void a();, и компоновщик находит реализации этих функций в самой библиотеке.

+0

Надеюсь, вы не пытаетесь добраться до вершины с ответом, помогая мне ...!? – 2013-03-16 17:15:52

+0

что заставило вас подумать * I * отказал ваш ответ – Axarydax

+0

Подозрительное время, и факт что ваш ответ в основном говорит так же, как и его, и он не проголосовал. Мне тоже было интересно об этом. – cHao

4

Препроцессор, как следует из названия, представляет собой программу, которая выполняется перед компилятором. Все, что он делает, это простые текстовые подстановки.

Когда указана директива #include, она просто «вставляет» полный файл в место, где была указатель. То же самое относится к макрорасширениям, когда обнаружен макрос «вызов», тело макроса «вставлено» на свое место.

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

Существует, в основном, два типа библиотек: только библиотеки заголовков и библиотеки, с которыми необходимо установить связь. Первый тип, только библиотеки заголовков, - это именно то, что подразумевается в названии: они полностью содержатся в заголовочных файлах, которые вы включаете. Однако подавляющее большинство библиотек - это библиотеки, с которыми вам нужно связываться. Это делается на этапе после компилятор выполнил свою работу по специальной программе. Как это используется, конечно, зависит от среды.

В общем, составление программы можно разделить на следующие этапы:

  1. Редактирование
  2. Препроцессор
  3. Compiler
  4. Linker

Шаг редактирования, что вы делаете для создания вашего источника.

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

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

Смежные вопросы