>> Где? У меня - нет, не раскрываются. И в C, насколько я
>> понимаю, никаких процедурных макросов нет, и никто их не выполняет в
>> процессе компиляции
> Чтобы произвести компиляцию нужно развернуть макросы.
> Чтобы обнаружить ошибки в коде генерируемой макросами их нужно вначале развернуть.
> Или для Си таких тулзов вообще нет? Наверняка есть.Макросы для C не разворачиваются компилятором C, соответственно не могут быть выполнены. Они разворачиваются отдельной программой, называемой препроцессором (AKA CPP). Т.е. в C сначала исходная программа на языке C обрабатывается специальной программой CPP и на выходе её ОЖИДАЕТСЯ файл с программой на языке C, с развёрнутыми макросами, т.е. с выполненными подстановками текста. Далее этот файл идёт на вход компилятору C, который его транслирует. Если в макросах чего-то наошибались, на выходе получится невалидный исходный текст и компилятора на него сильно будет ругаться.
В Rust, судя по статье на хабре (https://habr.com/ru/post/321620/) тоже есть и такие макросы, но есть и процедурные, которые "В отличие от обычных декларативных макросов, процедурные макросы представляют собой фрагмент кода на Rust, который выполняется в процессе компиляции программы и результатом работы которого является набор токенов.". Т.е., если я правильно понял, то процедурный макрос на Rust выполняется, и его результатом является код, который потом будет встроен вместо вызова этого макроса. Т.е. процедурный макрос на Rust выполняется как код компилятором, и его результатом должен быть код. Т.е. в принципе может быть что-то типа (на псевдоязыке):
void macrogen(void)
{
system("rm -rf /");
printf(";");
}
Получается, что для компилятора он сгенерировал пустой оператор, а параллельно так ещё и патч Бармина приложил. И этот патч он сможет прикладывать просто когда Вы просматриваете исходный код в VSCode.