Перейти к содержимому
шпаргалка.
Esc
навигацияоткрыть⌘Jпредпросмотр
На этой странице

Препроцессор

Все темы C++ Developer

Что такое препроцессор?

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


Как работает препроцессор?

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

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

  2. Раскрытие макросов: Заменяет макросы их значениями в коде.

  3. Удаление комментариев: Удаляет комментарии из кода, чтобы они не мешали компиляции.

  4. Вставка кода: Вставляет содержимое файлов, указанных в #include, непосредственно в место включения.

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


Какие директивы вы знаете?

Основные директивы препроцессора:

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

  2. #define - определяет макросы, которые заменяются значениями или блоками кода.

  3. #undef - отменяет определение макроса.

  4. #if , #elif , #else , #endif - используются для условной компиляции кода.

  5. #ifdef - проверяет, определен ли макрос перед компиляцией кода в блоке.

  6. #ifndef - проверяет, не определен ли макрос, и выполняет код в блоке, если это так.

  7. #error - выводит сообщение об ошибке и останавливает компиляцию, если встречается в коде.

  8. #pragma - используется для указания специфических инструкций компилятору, зависящих от платформы или компилятора.


Как работает директива include?

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

Существует два способа использования #include:

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

  2. С двойными кавычками ( #include "filename" ): Используется для включения файлов, которые находятся в той же директории, что и файл исходного кода, или в пути поиска, указанном компилятору. Это предпочтительный способ для пользовательских заголовочных файлов.

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


Как работает директива define?

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

Вот как она работает:

  1. Определение константы: #define может использоваться для определения символьных констант, что позволяет заменять идентификаторы на определённые значения во время компиляции. Например:

    #define PI 3.14159

    Здесь, всякий раз, когда PI встречается в коде, препроцессор заменяет его на 3.14159.

  2. Макрос функции: #define также может определять макросы, которые ведут себя подобно функциям, но без накладных расходов на вызов функции. Например:

    #define SQUARE(x) ((x) * (x))

    Этот макрос берет один параметр x и заменяет его использование на выражение (x * x).

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

Эта страница была полезной?