2011-01-21 3 views
4

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

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

И, я думаю:

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

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

ответ

5

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

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

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

+0

@ Тони. Можете ли вы просто объяснить это с точки зрения, например, «#include » в качестве примера? Поскольку я почти получаю это. Благодарю. – Simplicity

+0

@ Тони. («директивы препроцессора» являются указаниями препроцессора об изменениях, которые он должен внести в код до того, как последующие этапы компиляции будут удалены). Каковы примеры изменений здесь? Благодарю. – Simplicity

+0

@ Тони. Извините за мои многочисленные вопросы. Что касается «препроцессора», можете ли вы просто описать его чуть подробнее? Благодарю. – Simplicity

8

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

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

#define FOO 1 

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

#warning Untested code ! 

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

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

0

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

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

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

+0

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

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