Yerel Olmayan Çıkışların Ayrıntıları
Önceki XXIII. Oylum - Yerel Olmayan Çıkışlar Sonraki
Yerel Olmayan Çıkışların Ayrıntıları
Burada yerel olmayan çıkışları gerçekleştirmekte kullanılan veri yapıları ve işlevler ayrıntılı olarak incelenecektir. Bu oluşumlar setjmp.h dosyasında bildirilmiştir.
jmp_buf
veri türü
jmp_buf türündeki nesneler bir yerel olmayan çıkış tarafından eski durumuna getirilecek durum bilgisini tutar. Bir jmp_buf içeriği dönülecek yeri belirtir.
int setjmp
(jmp_buf durum)
makro
Normal olarak çağrıldığında, setjmp işlevi yazılımın icra durumu hakkında bilgiyi durum nesnesine kaydeder ve sıfırla döner. Daha sonra bir yerel olmayan çıkış gerçekleştirmek için bu durum bilgisi ile bir longjmp çağrısı yapılırsa, setjmp sıfırdan farklı bir değerle döner.
void longjmp
(jmp_buf durum,
 int     değer)
işlev
Bu işlev o anki çalışma durumunu durum nesnesinde kayıtlı durum ile değiştirerek icranın dönüş noktasını oluşturan setjmp çağrısından devam etmesini sağlar. setjmp'ın dönüş durumu 0 yerine, longjmp çağrısının değer argümanında belirtilen değer olur. (Ancak, eğer değer olarak sıfır verilmişse, setjmp işlevi 1 ile döner).
setjmp ve longjmp kullanımında önemli sınırlamalar getirmeyen bazı karanlık noktalar vardır. Bu sınırlamaların çoğu hala vardır, çünkü yerel olmayan çıkışlar C derleyicisinin bir kısmının biraz sihirli olmasını ve dilin diğer parçaları ile tuhaf bir şekilde etkileşmesini gerektirir.
setjmp işlevi aslında bir işlev tanımı olmaksızın bir makrodur, yani onu #undef yapamazsınız ve adresini alamazsınız. Ek olarak, setjmp çağrıları sadece aşağıdaki bağlamla güvenlidir.
  • Bir seçim ya da yineleme deyiminin sınama ifadesi olarak. (örneğin, if, switch veya while).
  • Bir seçim ya da yineleme deyiminin sınama ifadesinde görünen bir eşitlik ya da karşılaştırma işlecinin terimi olarak. Diğer terim bir tamsayı sabit ifadesi olmalıdır.
  • Bir seçim ya da yineleme deyiminin sınama ifadesinde görünen bir tek terimli ! işlecinin terimi olarak.
  • Bir ifade deyimi olarak kendisi tarafından.
Geri dönüş noktaları, sadece bu dönüş noktalarını oluşturan setjmp'ı çağıran işlevin (örnekteki, main işlevi) çalışması boyunca geçerlidirler. Eğer zaten dönmüş bir işlevde kurulu bir dönüş noktasına longjmp yapılırsa bunun sonuçları öngörülemez ve yıkıcı etkileri olabilir.
longjmp çağrısında değer argümanına sıfırdan farklı bir değer belirtmelisiniz. longjmp'ın, setjmp'dan dönecek değer olarak, setjmp'a sıfır değerini aktarmayı reddetmesi, aslında kaza ile oluşacak bir kötü kullanıma karşı oluşturulmuş bir güvencedir.
Bir yerel olmayan çıkış yaptığınızda, erişilebilir nesneler genellikle longjmp çağrısı yapıldığı sıradaki değerlerinde kalırlar. Bunun istisnası, setjmp çağrısını içeren işlevin yerel özdevinimli değişkenlerinin değerlerinin, setjmp çağrısının belirsizliğinden dolayı değişmesidir. Bunun olmaması için onları volatile olarak bildirebilirsiniz.
Önceki Üst Ana Başlık Sonraki
Yerel Olmayan Çıkışlar Hakkında Başlangıç Yerel Olmayan Çıkışlarda Sinyaller
Bir Linux Kitaplığı Sayfası