Макросы - это рудимент. Пережиток прошлого. Во многих современных языках их нету принципиально. Хотя в C/C++ они выполняют функцию такого себе прозрачного преобразования исходника перед сборкой. С помощью М. можно например принять решение о платформенной компилляции WIN32/LINUX/MAC. Напихать ассемблера с вариантами.
В gcc кажется есть ключи которые позволяют увидеть код программы после макро-подстановки.
Вообще с помощью М. можно делать разные веселые вещи например переименовать TRUE в FALSE. Такая себе тема троллинга на собеседовании.
Вот это предложение - хорошее.
compiled{
if(something){
}
}
Но я думаю что комитет его уже обсуждал. Надо найти только протоколы.
Почитайте еще спецификацию ZigLang. Там были реализованы какие-то фичи с compile time.