Препроцессор, как следует из названия, представляет собой программу, которая выполняется перед компилятором. Все, что он делает, это простые текстовые подстановки.
Когда указана директива #include
, она просто «вставляет» полный файл в место, где была указатель. То же самое относится к макрорасширениям, когда обнаружен макрос «вызов», тело макроса «вставлено» на свое место.
Препроцессор не имеет ничего общего с библиотеками. Это просто, что C (и C++) должны иметь все свои функции и переменные, объявленные до их использования, поэтому размещение деклараций в заголовочном файле, включенном препроцессором, является простым способом получить эти декларации из библиотек.
Существует, в основном, два типа библиотек: только библиотеки заголовков и библиотеки, с которыми необходимо установить связь. Первый тип, только библиотеки заголовков, - это именно то, что подразумевается в названии: они полностью содержатся в заголовочных файлах, которые вы включаете. Однако подавляющее большинство библиотек - это библиотеки, с которыми вам нужно связываться. Это делается на этапе после компилятор выполнил свою работу по специальной программе. Как это используется, конечно, зависит от среды.
В общем, составление программы можно разделить на следующие этапы:
- Редактирование
- Препроцессор
- Compiler
- Linker
Шаг редактирования, что вы делаете для создания вашего источника.
Препроцессор и этапы компиляции часто объединяются в один шаг, что, вероятно, является причиной того, что у новичков есть путаница относительно того, что действительно делает препроцессор.
Заключительный шаг, связывающий, принимает входные данные от компилятора и использует это вместе с библиотеками, которые вы указали для создания окончательного исполняемого файла.
Чтобы дать вам подсказку, единственный способ не включать в себя компоновщик - это превратить скомпилированную программу в полную операционную систему. Помните, что некоторые вызовы функций - это вызовы функций, предоставляемых операционной системой; то есть открытие и чтение из файла. Стандартная библиотека не включает весь код, необходимый для этого; он делегирует фактическую работу ОС. – stakx
В качестве упражнения просто создайте файл .c, который ** только ** содержит '#include', скомпилируйте его (например, с помощью 'gcc -c file.c' и посмотрите на сгенерированный объект (возможно, с objdump). –
wildplasser