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