Привет, лор.
Предыстория: нужно сделать некоторый функционал, который позволит повторять код без использования циклов (на самом деле задача сложнее, но углубляться пока нету смысла). В чем бы сложность, спросит читатель, goto, jmp в помощь. А вот суть такова, что неизвестно сколько программист-пользователь захочет расставить таких «меток». Более того, его удобство требует, чтобы это были некоторые макросы. Пример:
void foo()
{
MACRO_INIT()
int i = 0;
MACRO()
i++
MACRO()
i--
MACRO_FIN()
}
Собственно, между макросами что-то несколько раз повторяется. И макросов этих может быть сколько угодно. Собственно, метки как-то не вариант. Есть два возможных варианта решения, которые были придуманы: писать препроцессор, который будет генерировать и ставить метки в код; прыгать через связку cs:rip, сохраняя и загружая состояния в макросах. Оба варианта геморные и грязные, но второй удобнее для пользователя.
Вопрос: есть ли какое-то лучшее решение, чем такие грязные хаки?
Бонусом отмечу, что задача, в теории, еще сложнее: эти макросы могут быть расположены вне вызова foo() и считаться должны по цепочке, т.е. должен еще очищаться стек от того, что туда положилось от вызова функции. Да и переходы в другие операторные блоки тоже. Но хочется решать задачу постепенно.