Пространства имён
Варианты
Действия

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

Материал из cppreference.com
< cpp
 
 
Язык С++
Общие темы
Управление программой
Операторы условного выполнения
Операторы повторения
Операторы перехода
Функции
объявление функции
объявление лямбда-функции
шаблон функции
спецификатор inline
спецификаторы исключений (устарело)
спецификатор noexcept (C++11)
Исключения
Пространства имён
объявление пространства имён
псевдонимы пространства имён
Типы
спецификатор decltype (C++11)
Спецификаторы
cv-спецификаторы
спецификаторы продолжительности хранения
спецификатор constexpr (C++11)
спецификатор auto (C++11)
спецификатор alignas (C++11)
Инициализация
Литералы
Выражения
Утилиты
Типы
typedef-объявление
объявление псевдонима типа (C++11)
атрибуты (C++11)
Приведения типов
неявные преобразования
const_cast-преобразование
static_cast-преобразование
dynamic_cast-преобразование
reinterpret_cast-преобразование
C-подобное и функциональное приведение типов
Выделение памяти
Классы
Особые свойства классовых функций
Специальные функции-члены
Шаблоны
шаблон класса
шаблон функции
специализация шаблона
упакованные параметры (C++11)
Разное
Ассемблерные вставки
 
 

Препроцессор работает во время выполнения фазы трансляции №4, до компиляции. Результат препроцессинга — один файл, который затем передается непосредственно компилятору.

[править] Директивы

Препроцессинговые директивы контролируют поведение препроцессора. Каждая директива занимает одну строку и имеет следующий формат:

  • символ #
  • препроцессинговая инструкция (одна из define, undef, include, if, ifdef, ifndef, else, elif, endif, line, error, warning, pragma) [1]
  • аргументы (в зависимости от инструкции)
  • перевод строки

Нулевая директива (символ #, за которым следует перевод строки) допускается и не имеет никакого эффекта.

[править] Возможности

Препроцессор имеет следующие возможности модификации исходного кода:

  • условная компиляция частей исходного файла (контролируется директивами #if, #ifdef, #ifndef, #else, #elif и #endif)
  • замена текстовых макросов с возможностью конкатенации и заключения в кавычки идентификаторов (контролируется директивами #define и #undef и операторами # и ##)
  • включение других файлов (контролируется директивой #include)
  • вызов предупреждения (контролируется директивой #warning)
  • вызов ошибки (контролируется директивой #error)

Следующими аспектами препроцессора можно управлять:

[править] Примечания

  1. Это директивы, определёные стандартом. Стандарт не определяет поведение для других директив: они могут быть проигнорированы, иметь какое-нибудь полезное значение или делать программу некорректной. Даже будучи проигнорированными, они удаляются из исходного кода после окончания работы препроцессора.