longjmp
Bir çağrı tarafından setjmp
ayarlanan yığın ortamını ve yürütme yerel ayarını geri yükler.
Sözdizimi
void longjmp(
jmp_buf env,
int value
);
Parametreler
env
Ortamın depolandığı değişken.
value
Çağrılmak üzere setjmp
döndürülecek değer.
Açıklamalar
İşlev, longjmp
daha önce tarafından setjmp
kaydedilen env
bir yığın ortamını ve yürütme yerel ayarını geri yükler. setjmp
ve longjmp
yerel goto
olmayan bir yürütme yöntemi sağlar; bunlar genellikle normal çağrı ve dönüş kuralları kullanılmadan daha önce çağrılan bir yordamda yürütme denetimini hata işleme veya kurtarma koduna geçirmek için kullanılır.
çağrısı setjmp
, geçerli yığın ortamının içinde env
kaydedilmesine neden olur. Sonraki bir çağrı longjmp
, kaydedilen ortamı geri yükler ve denetimi ilgili setjmp
çağrının hemen ardından noktaya döndürür. Yürütme, çağrı tarafından döndürüldü gibi value
devam eder setjmp
. Rutin alma denetimi tarafından erişilebilen tüm değişkenlerin (yazmaç değişkenleri hariç) değerleri çağrıldığında longjmp
sahip oldukları değerleri içerir. Yazmaç değişkenlerinin değerleri tahmin edilemez. tarafından setjmp
döndürülen değer sıfır olmayan olmalıdır. 0 olarak geçirilirse value
, 1 değeri gerçek dönüşte değiştirilir.
Microsoft'a Özgü
Windows üzerinde Microsoft C++ kodunda, longjmp
özel durum işleme koduyla aynı yığın geri sarma semantiğini kullanır. C++ özel durumlarının oluşturulabileceği yerlerde kullanmak güvenlidir. Ancak, bu kullanım taşınabilir değildir ve bazı önemli uyarılar ile birlikte gelir.
Yalnızca çağrılan setjmp
işlevden önce çağrısı longjmp
döndürür; aksi takdirde sonuçlar tahmin edilemez.
kullanırken longjmp
aşağıdaki kısıtlamalara dikkat edin:
Yazmaç değişkenlerinin değerlerinin aynı kalacağını varsaymayın. Rutin çağrıdaki
setjmp
yazmaç değişkenlerinin değerleri yürütüldükten sonralongjmp
uygun değerlere geri yüklenmeyebilir.Kesmeye kayan nokta özel durumu neden olmadığı sürece, denetimi kesme işleme yordamının dışına aktarmak için kullanmayın
longjmp
. Bu durumda, bir program ilk olarak çağırarak_fpreset
kayan nokta matematik paketini yeniden başlatırsa aracılığıylalongjmp
bir kesme işleyicisinden döndürebilir.Windows kodu tarafından doğrudan veya dolaylı olarak çağrılan bir geri çağırma yordamından denetimi aktarmak için kullanmayın
longjmp
.Kod /EHs veya /EHsc kullanılarak derlenmişse ve çağrıyı
longjmp
içeren işlev isenoexcept
, yığın geri sarma sırasında bu işlevdeki yerel nesneler yok edilmeyebilir.
END Microsoft'a Özgü
Not
Taşınabilir C++ kodunda, C++ nesne semantiğini varsayamaz setjmp
ve longjmp
destekleyemezsiniz. Özellikle, bir setjmp
/longjmp
çağrı çifti ile longjmp
catch
değiştirildiğinde setjmp
tanımsız bir davranışa sahiptir ve throw
herhangi bir otomatik nesne için önemsiz olmayan yıkıcıları çağırır. C++ programlarında C++ özel durum işleme mekanizmasını kullanmanızı öneririz.
Daha fazla bilgi için bkz . setjmp ve longjmp kullanma.
Gereksinimler
Yordam | Gerekli başlık |
---|---|
longjmp |
<setjmp.h> |
Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.
Örnek
örneğine _fpreset
bakın.