Что такое препроцессор в C++
Что проверяют
Понимаете ли вы, что происходит до компиляции, и осознаёте ли цену макросов в языке, где почти для всех их задач есть типобезопасная замена. Ответ показывает, различает ли кандидат стадии сборки и умеет ли смотреть на промежуточный результат, когда сборка ведёт себя странно.
Как отвечать
Препроцессор работает с текстом до разбора кода компилятором: подставляет содержимое включаемых файлов, разворачивает макросы, вырезает ветки по условиям. На выходе получается единица трансляции, которую уже видит компилятор. Посмотреть её можно ключом -E, и это первое, что стоит сделать, когда непонятно, какой код собрался.
Что он умеет: включение заголовков через #include, условная компиляция под платформу и конфигурацию сборки через #ifdef и #if, предопределённые макросы вроде __FILE__ и __LINE__, превращение аргумента в строку и склейка имён.
Защита от повторного включения делается классическими стражами #ifndef и #define в паре с #endif либо директивой #pragma once, которую поддерживают все основные компиляторы, хотя в стандарте её нет.
Чего делать не стоит: константы через #define заменяются на constexpr, функциеподобные макросы на шаблоны и встраиваемые функции. Причина в том, что макрос не знает ни типов, ни областей видимости, его не видит отладчик, а ошибка вылезает уже в развёрнутом тексте и читается плохо.
Где спотыкаются
Пишут макрос без скобок и получают неверный результат на выражении в аргументе. Скобки вокруг каждого аргумента и вокруг всего тела обязательны, но и они не спасают от аргумента с побочным эффектом, который развернётся и вычислится дважды.
Считают, что препроцессор что-то оптимизирует и что макрос быстрее константы. Оптимизирует компилятор, а константа с типом даёт ему больше информации, чем текстовая подстановка.
Определяют макросы с распространёнными именами вроде минимума и максимума и ломают любой чужой заголовок, где такие имена встречаются как обычные функции. Пространства имён на макросы не действуют, поэтому имена делают длинными и с префиксом проекта.