Небольшой вопрос к C++-волшебникам.
Мне хочется на функции навесить что-то вроде аттрибутов (compile-time аннотаций из C#/Java), чтобы потом в момент компиляции/сборки их проанализировать и что-то сделать.
Например так: `int [[static_boundary(«immutable»)]] foo()`
В момент компиляции оно должно будет увидеть этот аттрибут и обернуть foo в небольшую функцию-обёртку (например, сгенерив слегка видоизмененный файл, или напрямую запатчив AST в компиляторе)
Зачем это нужно. Например этот аттрибут в примере будет говорить, что мы считаем всё внутри foo немутабельным, даже если по синтаксису кажется , что это не так, и на основании этого выполняется несколько дополнительных однократных глобальных инициализаций. Не спрашивайте, зачем.
Эта фича нужна скорей не по виду, а по смыслу. Другие формы записи того же самого тоже подойдут (если они кроссплатформенно работают с clang).
Проблема в том, что если просто так навесить мою [[static_boundary]], то в AST (по крайней мере в clang) её не будет. Нужно пересобирать комплиятор, запатчив список аттрибутов в Attr.td. Ну и потом вообще придётся напрямую эксплуатировать clang, пусть даже он и умеет работать как библиотека. Все это как-то мерзко и анально.
Есть ли какие-нибудь более красивые решения?