ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 июля
404337 Топик полностью
fk0, легенда (23.04.2013 09:19, просмотров: 133) ответил Ale3000 на Круто. В IARе так можно как-нибудь? У меня ни в Си, ни в Си++ не компилится.
В IAR'е скорей никак. В языке C вложенных функций вообще нет. Это -- расширение GCC. Если компилятор основан на GCC то работать, возможно, будет, а может и не будет, ибо коммерческие компиляторы на основе GCC внутри не так хороши, как кажутся. В C++ это не будет работать даже в GCC. Впрочем в C++ наличие объектов позволяет добиться чего-то отдалённо похожего. Да, разумеется переменные объемлющей функции (внутри которой определена вложенная функция) видны во вложенной функции и вложенных в неё функциях... Впрочем здесь отличие от javascript, lisp или perl, например, что видимость переменных определяется статически и зависит от того, где функция определена, а не просто видны все переменные вызывающих функций, вне зависимости от того, где вызываемая функция определена. Как это в GCC сделано? В отдельном регистре, хранится Frame Pointer (условно, в детали не вникал) функции в которой определена вложенная, и так весь стек вложенностей размотать можно до самого верха. Из этого следует важная проблема: если куда-то передаётся указатель на вложенную функцию, то при вызове по этому указателю нужно восстановить этот регистр. Для чего GCC использует методику trampoline -- размещение на стеке кода, адрес на который берётся (вместо адреса функции), этот код восстанавливает регистр и переходит на адрес функции. Проблемы возникают при неисполняемом стеке или при гарвардской архитектуре. Ограниченно (без указателей) там вложенные функции могут работать.
[ZX]