2013-07-29 16 views
5

Sadece gcc (http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attributes.html) için funciton özniteliklerini arıyordum ve returns_twice özniteliğine rastladım.işlev özniteliği return_twice

Ve bu durumda bir fonksiyonun iki kez geri dönebileceği konusunda kesinlikle clueless ... Hızlı bir şekilde söz konusu vfork() ve setjmp()'a baktım ama geçerli bir senaryonun nasıl göründüğüne dair bir fikir almadan devam edersiniz. bit?

+4

() 'yavaşça' vfork'u() 've' setjmp arayın. – alk

cevap

4

setjmp fonksiyonu daha sonra etiket ve aslında kendisine atlamak her zaman ayarlarken gibi ilk setjmp itibaren dönecektir, (goto anlamda) bir etiket oluşturarak benzer. Garip görünüyorsa

, günlük programlamada setjmp kullanarak olmamalıdır, emin. Ya aslında ... tüm anda sadece kullanıyor muhtemelen olmamalıdır. Özellikle C++ beklenen yürütme (çok goto gibi) akış ve, kırmak çok düşük seviyeli komut, invaryantların çoğu sizi bekliyor olabilir.

1

setjmp numaralı telefonu aradığınızda, bir geri dönüş noktası olarak, yürütmenin setjmp çağrısını hemen takip eden kodda devam ettiğini belirler. (setjmp önceki çağrısıyla başlatıldı atlama tamponu ile) daha aynı noktadan başlamak yürütme döner longjmp (yani, bu kod arama setjmp aşağıdaki) arama kodu daha sonra bir noktada

.

Bu nedenle, orijinal arama döner normal olarak, daha sonra yeniden aynı noktaya rasgele sonraki zamanlarda, yürütme döner (ya da en azından Mayıs dönüş) de.

nitelik basitçe gerçeği derleyici uyarır.