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