Я предполагаю, что под «макросом» вы подразумеваете, что инструмент LP выполняет «макро-замену», как препроцессор Си и большинство ассемблеров.
Подстановка макросов - "синтаксический сахар". Это способ написать один символ, который обозначает множество похожих деталей. Отсюда и термин «макрос»: это было «макропрограммирование», написанное на более высоком уровне абстракции.
Это то, что мы делали в прежние времена, когда у нас не было объектно-ориентированного программирования, обеспечивающего легкодоступные слои абстракции.
Технически - было возможно иметь уровни абстракции и программирования в стиле макроса на C, используя только вызовы функций. Программирование макропроцессора не обязательно необходимо . Например, мы использовали для определения встроенных функций как «макрос» препроцессора для ручной оптимизации нашего кода. Это потому, что компилятор C не очень хорошо оптимизировал в первые дни.
Теперь, когда у нас есть ОО-программирование, возможности макросов более примитивных языков программирования не нужны.
Функция макроса Literate Programming использовалась в неOO-языках (таких как C и Pascal) для создания возможностей, подобных классам, и возможностей, подобных наследованию, на уровне LP.
Нет смысла в этом. Просто определите правильные классы и используйте правильное наследование.