Я до сих пор не уверен в продолжениях, но, по крайней мере, для сопрограмм, нет хорошего способа сделать это в C. Потому что это вне абстракции C.setjmp/longjmp
имеет ограничение области действия, может нарушить работу системы исключений C ++ / Objective-C, makecontext/swapcontext
устарело.Хотя некоторые системы все еще поддерживают функции, но, по крайней мере, Apple OS больше не поддерживает их.
Единственное приемлемое решение для меня было libtask
библиотека .Который использует специфичные для архитектуры коды сборки для сохранения и восстановления состояния регистра, а также управляет стеками вызовов.Я думаю, что он использует монолитный стек и все еще имеет ограничение по размеру, но в любом случае, это почти единственное решение, которое я смог найти, которое надежно работает.) функция включит очень общую поддержку сопрограмм на уровне C.И я надеюсь позже свободно написать код сопрограммы на LLVM.