longjmp
Memulihkan lingkungan tumpukan dan lokal eksekusi yang setjmp
ditetapkan oleh panggilan.
Sintaks
void longjmp(
jmp_buf env,
int value
);
Parameter
env
Variabel tempat lingkungan disimpan.
value
Nilai yang akan dikembalikan ke setjmp
panggilan.
Keterangan
Fungsi ini longjmp
memulihkan lingkungan tumpukan dan lokal eksekusi yang sebelumnya disimpan env
oleh setjmp
. setjmp
dan longjmp
menyediakan cara untuk menjalankan nonlokal goto
; biasanya digunakan untuk meneruskan kontrol eksekusi ke penanganan kesalahan atau kode pemulihan dalam rutinitas yang sebelumnya disebut tanpa menggunakan konvensi panggilan dan pengembalian normal.
Panggilan untuk setjmp
menyebabkan lingkungan tumpukan saat ini disimpan di env
. Panggilan berikutnya untuk longjmp
memulihkan lingkungan yang disimpan dan mengembalikan kontrol ke titik segera setelah panggilan yang setjmp
sesuai. Eksekusi dilanjutkan seolah-olah value
telah dikembalikan oleh setjmp
panggilan. Nilai semua variabel (kecuali variabel register) yang dapat diakses oleh kontrol penerimaan rutin berisi nilai yang mereka miliki ketika longjmp
dipanggil. Nilai variabel register tidak dapat diprediksi. Nilai yang dikembalikan oleh setjmp
harus bukan nol. Jika value
diteruskan sebagai 0, nilai 1 diganti dalam pengembalian aktual.
Khusus Microsoft
Dalam kode Microsoft C++ di Windows, longjmp
menggunakan semantik stack-unwinding yang sama dengan kode penanganan pengecualian. Aman untuk digunakan di tempat yang sama dengan pengecualian C++ yang dapat dinaikkan. Namun, penggunaan ini tidak portabel, dan dilengkapi dengan beberapa peringatan penting.
Hanya panggil longjmp
sebelum fungsi yang disebut setjmp
mengembalikan; jika tidak, hasilnya tidak dapat diprediksi.
Amati batasan berikut saat menggunakan longjmp
:
Jangan berasumsi bahwa nilai variabel register akan tetap sama. Nilai variabel register dalam panggilan
setjmp
rutin mungkin tidak dipulihkan ke nilai yang tepat setelahlongjmp
dijalankan.Jangan gunakan
longjmp
untuk mentransfer kontrol keluar dari rutinitas penanganan interupsi kecuali gangguan disebabkan oleh pengecualian titik mengambang. Dalam hal ini, program dapat kembali dari handler interupsi melaluilongjmp
jika pertama kali menginisialisasi ulang paket matematika floating-point dengan memanggil_fpreset
.Jangan gunakan
longjmp
untuk mentransfer kontrol dari rutinitas panggilan balik yang dipanggil secara langsung atau tidak langsung oleh kode Windows.Jika kode dikompilasi dengan menggunakan /EHs atau /EHsc, dan fungsi yang berisi
longjmp
panggilan adalahnoexcept
, maka objek lokal dalam fungsi tersebut mungkin tidak dihancurkan selama unwind tumpukan.
END Khusus Microsoft
Catatan
Dalam kode C++ portabel, Anda tidak dapat mengasumsikan setjmp
dan longjmp
mendukung semantik objek C++. Secara khusus, setjmp
/longjmp
pasangan panggilan memiliki perilaku yang tidak terdefinisi jika mengganti setjmp
dan longjmp
oleh catch
dan throw
akan memanggil destruktor non-sepele untuk objek otomatis apa pun. Dalam program C++, kami sarankan Anda menggunakan mekanisme penanganan pengecualian C++.
Untuk informasi selengkapnya, lihat Menggunakan setjmp dan longjmp.
Persyaratan
Rutin | Header yang diperlukan |
---|---|
longjmp |
<setjmp.h> |
Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.
Contoh
Lihat contoh untuk _fpreset
.
Baca juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk