Когда мы видим #include <iostream>
, это называется директивой препроцессора.
#include
---> директива
И я думаю:
<iostream>
---> препроцессор
Но что подразумевается под «препроцессором» и «директивой»?
Когда мы видим #include <iostream>
, это называется директивой препроцессора.
#include
---> директива
И я думаю:
<iostream>
---> препроцессор
Но что подразумевается под «препроцессором» и «директивой»?
Это может помочь подумать о взаимосвязи между директивой и полученными указаниями (то есть приказами). Директивы препроцессора - это указания препроцессору об изменениях, которые он должен внести в код до того, как начнутся более поздние этапы компиляции.
Но что за препроцессор? Что ж, его название отражает то, что он обрабатывает исходный код перед основными этапами компиляции. Он просто предназначен для обработки текстового исходного кода, изменяя его различными способами. Препроцессор даже не понимает токены, с которыми он работает - он не имеет понятия о типах или переменных, классах или функциях - он просто сгруппирован в кавычки и / или круглые скобки, текст, разделенный запятыми и / или пробелами, который нужно обрабатывать. Этот дополнительный процесс дает большую гибкость в выборе, объединении и даже создании частей программы.
РЕДАКТИРОВАТЬ, обращаясь к комментарию @ SWEngineer: многие люди считают полезным рассматривать препроцессор как отдельную программу, которая модифицирует программу C ++, а затем передает ее результат реальному компилятору C ++ (это в значительной степени то, что было раньше). Когда препроцессор видит #include <iostream>
, он думает аааа - это то, что я понимаю, я собираюсь позаботиться об этом, а не просто передавать это вслепую компилятору C ++. Таким образом, он выполняет поиск в ряде каталогов (некоторые стандартные, такие как /usr/include
и везде, где компилятор установил свои собственные заголовки, а также другие, указанные с помощью -I
в командной строке) в поисках файла с именем iostream. Когда он его находит, он затем заменяет строку во входной программе с #include полным содержимым файла с именем iostream, добавляя результат к выходным. НО, затем он переходит к первой строке, которую он прочитал из файла iostream, ища другие директивы, которые он понимает.
Итак, препроцессор очень простой. Он может понимать #include
, #define
, _6 _ / _ 7 _ / _ 8_, #ifdef
и $ifndef
, #warning
и #error
, но не более того. Он не имеет ни малейшего понятия, что такое int
, шаблон, класс или что-то из этого реального C ++. Это больше похоже на некий автоматический редактор, который вырезает и вставляет части файлов и кода, подготавливая программу, которую компилятор C ++ в конечном итоге увидит и обработает. Препроцессор по-прежнему очень полезен, потому что он знает, как находить части программы во всех этих разных каталогах (на следующем этапе компиляции ничего не нужно знать об этом), и он может удалить код, который может работать на каком-то другом. компьютерная система, но не будет действительна для той, которая используется. Это также может позволить программе использовать короткие краткие операторы макросов, которые генерируют большой объем реального кода C ++, что делает программу более управляемой.
#include
- это директива препроцессора, <iostream>
- это просто аргумент, поставляемый в дополнение к этой директиве, которая в данном случае является именем файла.
Некоторые директивы препроцессора принимают аргументы, некоторые - нет, например
#define FOO 1
#ifdef _NDEBUG
....
#else
....
#endif
#warning Untested code !
Общей чертой является то, что все они начинаются с #
.
В прежние времена препроцессор был отдельным инструментом, который предварительно обрабатывал исходный код перед передачей его интерфейсу компилятора, выполняя подстановки макросов, включая файлы заголовков и т. Д. В наши дни препроцессор обычно неотъемлемая часть компилятора, но, по сути, выполняет ту же работу.
Директивы препроцессора, такие как #define
и #ifdef
, обычно используются для упрощения изменения исходных программ и их компиляции в различных средах выполнения. Директивы в исходном файле предписывают препроцессору выполнять определенные действия. Например, препроцессор может заменять токены в тексте, вставлять в исходный файл содержимое других файлов ...
#include
- это директива препроцессора, означающая, что она используется частью компилятора препроцессором. Это происходит «до» компиляции. #include
необходимо указать, что включать, это предоставляется аргументом iostream
. Это указывает препроцессору включить файл iostream.h
.
Дополнительная информация:
iostream
.
- person Lightness Races in Orbit; 21.09.2011