---
title: Препроцессор
seo:
  title: Препроцессор — C++ Developer
  description: Тема «Препроцессор» для собеседования C++ Developer. Что такое препроцессор? Как работает препроцессор?
---

[Все темы C++ Developer](/c-developer)

## <strong>Что такое препроцессор?</strong> [#q-14bee738d69b81c68c87d6daff94fff5]

Препроцессор в C++ — это инструмент, который выполняет предварительную обработку исходного кода перед его компиляцией. Препроцессор обрабатывает директивы, начинающиеся с символа <code>&#35;</code>, такие как <code>&#35;include</code> для включения файлов, <code>&#35;define</code> для определения макросов, <code>&#35;ifdef</code> и <code>&#35;ifndef</code> для условной компиляции. Препроцессор занимается раскрытием макросов, включением кода и удалением комментариев, тем самым подготавливая код к следующим этапам компиляции.

:::note[Ссылки для изучения]

1. [Препроцессоры в C++](https://metanit.com/c/tutorial/3.1.php)
   :::

---

## <strong>Как работает препроцессор?</strong> [#q-14bee738d69b812fb971c7c5449fb9f9]

Препроцессор в C++ обрабатывает исходный код до его компиляции. Он выполняет следующие задачи&#58;

1. <strong>Обработка директив</strong>&#58; Распознает и выполняет инструкции,
   начинающиеся с символа <code>&#35;</code>, такие как
   <code>&#35;include</code> для включения содержимого других файлов,
   <code>&#35;define</code> для создания макросов, и директивы условной
   компиляции (<code>&#35;if</code>, <code>&#35;ifdef</code>,
   <code>&#35;ifndef</code>).

1. <strong>Раскрытие макросов</strong>&#58; Заменяет макросы их значениями в
   коде.

1. <strong>Удаление комментариев</strong>&#58; Удаляет комментарии из кода,
   чтобы они не мешали компиляции.

1. <strong>Вставка кода</strong>&#58; Вставляет содержимое файлов, указанных в
   <code>&#35;include</code>, непосредственно в место включения.

Эти действия выполняются ещё до того, как компилятор начинает анализировать и трансформировать код в машинный язык.

:::note[Ссылки для изучения]

1. [Препроцессоры в C++](https://metanit.com/c/tutorial/3.1.php)
   :::

---

## <strong>Какие директивы вы знаете?</strong> [#q-14bee738d69b816b8060d8ca95009a39]

Основные директивы препроцессора&#58;

1. <code>&#35;include</code> - включает содержимое одного файла в другой в
   момент компиляции.

1. <code>&#35;define</code> - определяет макросы, которые заменяются значениями
   или блоками кода.

1. <code>&#35;undef</code> - отменяет определение макроса.

1. <code>&#35;if</code>
   <strong>,</strong> <code>&#35;elif</code>
   <strong>,</strong> <code>&#35;else</code>
   <strong>,</strong> <code>&#35;endif</code> - используются для условной
   компиляции кода.

1. <code>&#35;ifdef</code> - проверяет, определен ли макрос перед компиляцией
   кода в блоке.

1. <code>&#35;ifndef</code> - проверяет, не определен ли макрос, и выполняет код
   в блоке, если это так.

1. <code>&#35;error</code> - выводит сообщение об ошибке и останавливает
   компиляцию, если встречается в коде.

1. <code>&#35;pragma</code> - используется для указания специфических инструкций
   компилятору, зависящих от платформы или компилятора.

:::note[Ссылки для изучения]

1. [Препроцессоры в C++](https://metanit.com/c/tutorial/3.1.php)
   :::

---

## <strong>Как работает директива</strong> <code>include</code><strong>?</strong> [#q-14bee738d69b8143a835d54818d1914e]

Директива <code>&#35;include</code> в C++ используется для включения содержимого одного файла в другой файл во время компиляции. Она берёт все содержимое указанного файла и вставляет его в место, где стоит директива <code>&#35;include</code>. Это обычно используется для включения заголовочных файлов, которые содержат объявления классов, функций, макросов и других элементов, чтобы они были доступны в нескольких файлах исходного кода.

Существует два способа использования <code>&#35;include</code>&#58;

1. <strong>С угловыми скобками (</strong>
   <code>&#35;include &#60;filename&#62;</code>
   <strong>)</strong>&#58; Используется для включения стандартных библиотечных
   файлов или файлов, которые не находятся в текущей директории исходного кода.
   Компилятор ищет эти файлы в стандартных системных директориях.

1. <strong>С двойными кавычками (</strong>
   <code>&#35;include &#34;filename&#34;</code>
   <strong>)</strong>&#58; Используется для включения файлов, которые находятся
   в той же директории, что и файл исходного кода, или в пути поиска, указанном
   компилятору. Это предпочтительный способ для пользовательских заголовочных
   файлов.

Директива <code>&#35;include</code> просто вставляет содержимое файла в точку включения, поэтому она не добавляет какого-либо дополнительного функционала, кроме объединения текста файлов во время компиляции.

:::note[Ссылки для изучения]

1. [Препроцессоры в C++](https://metanit.com/c/tutorial/3.1.php)
   :::

---

## <strong>Как работает директива</strong> <code>define</code><strong>?</strong> [#q-14bee738d69b81fea478c3a38bac2267]

Директива <code>&#35;define</code> в C++ используется препроцессором для определения макросов. Макросы — это фрагменты кода, которые могут быть вставлены в другие части программы. Основное применение <code>&#35;define</code> — это создание констант и макросов функций.

Вот как она работает&#58;

1. <strong>Определение константы</strong>&#58; <code>&#35;define</code> может
   использоваться для определения символьных констант, что позволяет заменять
   идентификаторы на определённые значения во время компиляции. Например&#58;

   ```cpp
   #define PI 3.14159
   ```

   Здесь, всякий раз, когда <code>PI</code> встречается в коде, препроцессор заменяет его на <code>3&#46;14159</code>.

1. <strong>Макрос функции</strong>&#58; <code>&#35;define</code> также может
   определять макросы, которые ведут себя подобно функциям, но без накладных
   расходов на вызов функции. Например&#58;

   ```cpp
   #define SQUARE(x) ((x) * (x))
   ```

   Этот макрос берет один параметр <code>x</code> и заменяет его использование на выражение <code>&#40;x \* x&#41;</code>.

<code>&#35;define</code> просто текстовая замена, и она происходит перед
компиляцией кода. Это значит, что она не влияет на время выполнения программы и
не проводит проверок типов или вычислений до того, как код будет скомпилирован.

:::note[Ссылки для изучения]

1. [Препроцессоры в C++](https://metanit.com/c/tutorial/3.1.php)
   :::
