setjmp और longjmp (<setjmp.h>) C में नॉन-लोकल गोटो/एक्सेप्शन हैंडलिंग तंत्र प्रदान करते हैं।
सिंटैक्स और व्यवहार
int setjmp(jmp_buf env); // स्टेट सेव करता है, पहली बार 0 रिटर्न करता है void longjmp(jmp_buf env, int val); // सेव्ड स्टेट पर कूदता है, setjmp को val रिटर्न कराता है
मुख्य नियम
setjmpकेवल निम्न संदर्भों में प्रकट हो सकता है:if,switch,while,forकंडीशन, या सरल असाइनमेंट।longjmpके बाद,setjmpvalरिटर्न करता है (यदिval == 0तो 1 रिटर्न करता है)।- स्टैक अनवाइंडिंग नहीं होती - लोकल वेरिएबल्स के डिस्ट्रक्टर्स (C++) या
finally-स्टाइल क्लीनअप नहीं चलते। jmp_bufको ग्लोबल या स्टैटिक स्टोरेज में रखें (ऑटोमैटिक वेरिएबल अमान्य हो सकता है)।
उदाहरण: 100 बार प्रिंट (पिछले लेख से)
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;
int main() {
int count = 1;
if (setjmp(buf) == 0) { // पहली बार
// कुछ नहीं
} else {
// longjmp से वापसी
}
printf("5");
if (++count <= 100)
longjmp(buf, 1);
return 0;
}
व्यावहारिक उपयोग: एरर हैंडलिंग (try/catch अनुकरण)
#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>
jmp_buf error_env;
void risky_function(int fail) {
if (fail)
longjmp(error_env, 1); // एरर कोड 1 के साथ जंप
printf("Success\n");
}
int main() {
int err = setjmp(error_env);
if (err == 0) {
risky_function(1); // फेल होगा
} else {
printf("Caught error: %d\n", err);
}
return 0;
}
आउटपुट
Caught error: 1
चेतावनियां
- C++ में
try/catchप्राथमिकता दें (स्टैक अनवाइंडिंग, डिस्ट्रक्टर्स)। longjmpसेsetjmpके स्कोप से बाहर कूदना अनडिफाइंड बिहेवियर है।- सिग्नल हैंडलर्स में केवल
sigsetjmp/siglongjmpउपयोग करें।