Атрибут функции 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).

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

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

Другие вопросы по тегам