Атрибут функции return_twice

Я просто искал атрибуты funciton для gcc
(http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attributes.html)
и наткнулся на returns_twice приписывать.

И я абсолютно не понимаю, в каком случае функция может вернуться дважды … Я быстро посмотрел вышеупомянутый vfork() а также setjmp() но продолжайте, не зная, как выглядит подходящий сценарий — кто-нибудь из вас использовал его или может немного объяснить?

7

Решение

setjmp Функция аналогична созданию этикеткаgoto смысл), как таковой, вы сначала вернетесь из setjmp когда вы устанавливаете метку, а затем каждый раз, когда вы фактически переходите к ней.

Если это кажется странным, будьте уверены, вы не должны использовать setjmp в вашем ежедневном программировании. Или на самом деле … вы, вероятно, не должны использовать его совсем. Это команда очень низкого уровня, которая нарушает ожидаемый поток выполнения (очень похоже на goto) и, особенно в C ++, большинство ожидаемых инвариантов.

5

Другие решения

Когда вы звоните setjmp, он устанавливает, что в качестве точки возврата, то выполнение продолжается в коде, непосредственно следующем за setjmp вызов.

В какой-то момент позже в коде, позвонив longjmp (с буфером перехода, инициализированным предыдущим вызовом setjmp) возвращает выполнение, чтобы начать с той же точки снова (т. е. кода, следующего сразу за вызовом setjmp).

Поэтому исходный вызов возвращается нормально, затем в произвольные более поздние моменты времени возвращается выполнение (или, по крайней мере, может вернуться) в ту же точку снова.

Атрибут просто предупреждает компилятор об этом факте.

1

По вопросам рекламы [email protected]