Препроцессор при обработке макросов в C++ работает следующим образом:
- Определение макроса осуществляется с помощью директивы #define, за которой следует идентификатор макроса и его определение. 1
- Если имя макроса распознаётся в исходном тексте программы или в аргументах некоторых других команд препроцессора, оно рассматривается как вызов этого макроса. 5
- Имя макроса заменяется копией тела макроса. 5 Если макрос принимает аргументы, фактические аргументы после имени макроса заменяются на формальные параметры в теле макроса. 5
- Препроцессор выполняет рекурсивное расширение макросов до тех пор, пока все макросы не будут заменены их определениями. 1 Это может привести к сложным цепочкам подстановок, особенно при использовании вложенных макросов. 1 Для предотвращения бесконечной рекурсии препроцессор не выполняет повторное расширение макроса внутри его собственного определения. 1
Важно учитывать, что препроцессор выполняет чисто текстовую подстановку, не анализируя типы данных или синтаксическую корректность результата. 1 Это может привести к неожиданному поведению, если макрос определён некорректно. 1