Атрибут функции return_twice
Я просто искал атрибуты funciton для gcc ( http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attributes.html) и наткнулся на returns_twice
приписывать.
И я абсолютно не понимаю, в каком случае функция может вернуться дважды... Я быстро посмотрел вышеупомянутые vfork()
а также setjmp()
но продолжайте, не зная, как выглядит подходящий сценарий - кто-нибудь из вас использовал его или может немного объяснить?
2 ответа
setjmp
Функция аналогична созданию метки (в goto
смысл), как таковой, вы сначала вернетесь из setjmp
когда вы устанавливаете метку, а затем каждый раз, когда вы фактически переходите к ней.
Если это кажется странным, будьте уверены, вы не должны использовать setjmp
в вашем ежедневном программировании. Или на самом деле... вы, вероятно, не должны использовать его вообще. Это команда очень низкого уровня, которая нарушает ожидаемый поток выполнения (очень похоже на goto
) и, особенно в C++, большинство ожидаемых инвариантов.
Когда вы звоните setjmp
, он устанавливает, что в качестве точки возврата, то выполнение продолжается в коде, непосредственно следующем за setjmp
вызов.
В какой-то момент позже в коде, позвонив longjmp
(с буфером перехода, инициализированным предыдущим вызовом setjmp
) возвращает выполнение, чтобы начать с той же точки снова (т. е. кода, следующего сразу за вызовом setjmp
).
Следовательно, исходный вызов возвращается нормально, затем в произвольные более поздние моменты времени выполнение возвращается (или, по крайней мере, может вернуться) снова в ту же точку.
Атрибут просто предупреждает компилятор об этом факте.