2013-07-29 7 views
5

Właśnie sprawdzałem atrybuty funciton dla gcc (http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attributes.html) i natrafiłem na atrybut returns_twice.atrybut funkcji zwraca_wpis

Nie mam pojęcia, w jakim przypadku funkcja może powrócić dwa razy ... Szybko podniosłem wspomniane vfork() i setjmp(), ale nadal nie mam pojęcia, jak wygląda odpowiedni scenariusz - każdy z was użył go lub może wyjaśnić kawałek?

+4

Wyszukiwanie 'vfork()' i 'setjmp()' powoli. – alk

Odpowiedz

4

Funkcja setjmp jest analogiczna do tworzenia etykietę (w goto sensie), jako taki będzie najpierw wrócić z setjmp podczas ustawiania etykiety, a następnie za każdym razem, że rzeczywiście wskoczyć do niego.

Jeśli wydaje się dziwne, nie martw się, nie powinieneś używać setjmp w swoim codziennym programowaniu. A właściwie ... prawdopodobnie nie powinieneś go używać w ogóle. Jest to polecenie bardzo niskiego poziomu, które przerywa oczekiwany przepływ wykonawczy (podobnie jak goto), a zwłaszcza w C++, większość niezmienników, jakich można się spodziewać.

1

Po wywołaniu setjmp, określa, że ​​jako punkt zwrotny, wykonanie jest kontynuowane w kodzie następującym bezpośrednio po wywołaniu setjmp.

W pewnym punkcie w dalszej części kodu wywołanie longjmp (buforem skok inicjowane przez wcześniejszego wywołania setjmp) powraca do wykonania rozpocznie się od tego samego punktu ponownie (to znaczy kod bezpośrednio po zakończeniu rozmowy setjmp).

W związku z tym pierwotne połączenie powraca normalnie, a następnie w dowolnych późniejszych czasach, wykonanie zwraca (lub przynajmniej może wrócić) do tego samego punktu ponownie.

Ten atrybut po prostu ostrzega kompilator tego faktu.