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 setelah longjmp 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 melalui longjmp 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 adalah noexcept, 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

Kontrol proses dan lingkungansetjmp