forked from sorokin/cpp-notes
- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpreprocessor.tex
More file actions
Latest commit
65 lines (53 loc) · 3.39 KB
/
Copy pathpreprocessor.tex
File metadata and controls
65 lines (53 loc) · 3.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
\section{Препроцессирование}
Препроцессирование получает на вход .cpp файл и выдает на выход .i файл. Препроцессирование выполняется программой называемой препроцессор.
Препроцессор проходит по входному файлу, копируя текст в выходной файл. Если он встречает строку начинающуются с символа {\bf\#}, он выполняет команду, которая записана после {\bf\#}. Такие команды называются директивами препроцессора.
Примером директивы препроцессора является директива {\bf\#include}.
\begin{minted}[linenos, frame=lines, framesep=2mm, tabsize = 4, breaklines]{c++}
#include "somefile.h"
\end{minted}
Когда препроцесор встречает эту директиву, он подставляет на её место текст файла {\bf somefile.h}. При этом текст файла {\bf somefile.h} тоже препроцессируется. Если в нём есть какие-то директивы то они будут выполнены.
Пусть даны следующие файлы
\begin{minted}[linenos, frame=lines, framesep=2mm, tabsize = 4, breaklines]{c++}
// print.h
void print(char const*);
// main.cpp
#include "print.h"
int main()
{
print("Hello, world");
}
\end{minted}
Результатом препроцессирования {\bf main.cpp} будет:
\begin{minted}[linenos, frame=lines, framesep=2mm, tabsize = 4, breaklines]{c++}
void print(char const*);
int main()
{
print("Hello, world");
}
\end{minted}
В этом можно убедиться выполним команду {\bf g++ -E main.cpp}. Ключ {\bf -E} говорит драйверу, что нужно лишь отпрепроцессировать входной файл.
Директива {\bf\#include} имеет две формы
\begin{minted}[linenos, frame=lines, framesep=2mm, tabsize = 4, breaklines]{c++}
#include <somefile.h>
#include "somefile.h"
\end{minted}
Первая форма ищет файл {\bf somefile.h} в списке каталогов, называемых include directories. Их можно указать компилятору опцией {\bf -I}. Например:
\begin{minted}[linenos, frame=lines, framesep=2mm, tabsize = 4, breaklines]{sh}
g++ -Isome/directory -Ianother/directory -I../and/another/one myfile.cpp
\end{minted}
Файлы ищутся в этих директориях слева направо. Препроцессор автоматически добавляет в конец этого списка пути к директориям в которых лежат хедера стандартной библиотеки.
Вторая форма директивы {\bf\#include} ищет {\bf somefile.h} сначала в текущем каталоге, а потом в include directories.
В стандарте определены следующие директивы препроцессора:
\begin{enumerate}
\item\#define
\item\#elif
\item\#else
\item\#error
\item\#endif
\item\#if
\item\#ifdef
\item\#ifndef
\item\#include
\item\#pragma
\item\#undef
\end{enumerate}