Директивы препроцессора - PullRequest
4 голосов
/ 21 января 2011

Когда мы видим #include <iostream>, говорят, что это директива препроцессора .

#include ---> директива

И, я думаю:

<iostream> ---> препроцессор

Но что подразумевается под «препроцессором» и «директивой»?

Ответы [ 3 ]

8 голосов
/ 21 января 2011

#include - это директива препроцессора , <iostream> - это просто аргумент , предоставляемый в дополнение к этой директиве, которая в данном случае является именем файла.

Некоторые директивы препроцессора принимают аргументы, некоторые нет, например,

#define FOO 1

#ifdef _NDEBUG
    ....
#else
    ....
#endif

#warning Untested code !

Общей особенностью является то, что все они начинаются с #.

В Olden Times препроцессор был отдельным инструментом, который предварительно обрабатывал исходный код перед передачей его внешнему интерфейсу компилятора, выполняя подстановку макросов, включая заголовочные файлы и т. Д. В наши дни препроцессор обычно является неотъемлемой частью компилятора, но, по сути, выполняет ту же работу.

5 голосов
/ 21 января 2011

Это может помочь подумать о связи между «директивой» и «указанными направлениями» (т. Е. Приказами).«Директивы препроцессора» - это указания препроцессору об изменениях, которые он должен внести в код перед началом более поздних этапов компиляции. Но что такое препроцессор?Ну, это имя немного рекурсивное: оно просто обрабатывает текстовый исходный код, модифицируя его различными способами.Этот дополнительный процесс дает больше гибкости в выборе, объединении и даже генерации частей программы.

РЕДАКТИРОВАНИЕ адресации @ Комментарий SWEngineer: Представьте, что препроцессор - это отдельная программа, которая модифицирует программу C ++, а затем выдает свой вывод«настоящий» компилятор C ++ (это в значительной степени так, как раньше).Когда препроцессор видит «#include», он думает «аааа - это то, что я понимаю, я собираюсь позаботиться об этом, а не просто слепо передать его компилятору C ++».Таким образом, он ищет несколько каталогов (некоторые стандартные, такие как / usr / include и везде, где компилятор устанавливает свои собственные заголовки, а также другие, указанные с помощью -I в командной строке), ища файл с именем «iostream».Когда он находит его, он заменяет строку во входной программе, говорящую «#include», на полное содержимое файла с именем «iostream», добавляя результат к выводу.НО, затем он перемещается на первую строку, которую он прочитал из файла «iostream», в поисках дополнительных директив, которые он понимает.

Итак, препроцессор очень прост.Он может понимать #include, #define, # if / # elif / # endif, #warning, но не намного больше.Он не имеет ни малейшего представления о том, что такое int, шаблон, класс или что-то из этого «настоящего» C ++.Это больше похоже на некоторый автоматический редактор, который вырезает и вставляет части файлов и кода, подготавливая программу, которую в конечном итоге увидит и обработает сам компилятор C ++.Препроцессор все еще очень полезен, потому что он знает, как найти части программы во всех этих различных каталогах (на следующем этапе компиляции не нужно ничего знать об этом), и он может удалить код, который может работать на некоторых другихкомпьютерная система, но не будет действительна на используемом.Это также может позволить программе использовать короткие, краткие операторы макросов, которые генерируют много реального кода C ++, делая программу более управляемой.

0 голосов
/ 21 января 2011

Директивы препроцессора, такие как #define и #ifdef, обычно используются для упрощения изменения исходных программ и их компиляции в различных средах выполнения.Директивы в исходном файле указывают препроцессору выполнять определенные действия.Например, препроцессор может заменить токены в тексте, вставить содержимое других файлов в исходный файл ...

#include - это директива препроцессора, означающая, что она используется препроцессором часть компилятора.Это происходит «до» процесса компиляции.В #include необходимо указать «что» включить, это предоставляется аргументом iostream.Это говорит препроцессору включить файл iostream.h.

Дополнительная информация:

...