Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C में setjmp और longjmp फंक्शन्स


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 के बाद, setjmp val रिटर्न करता है (यदि 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 उपयोग करें।
  1. UEFI और Windows 8 UEFI और Windows 8

    इस लेख में हम UEFI धारणा की अवधारणा और Windows 8 में इस तकनीक के अनुप्रयोग का पता लगाते हैं। UEFI तकनीक क्या है? UEFI संक्षिप्त नाम Unified Extensible Firmware Interface के लिए है। यह तकनीक पारंपरिक कंप्यूटर बूट सिस्टम संशोधन के लिए डिज़ाइन की गई है और अप्रचलित BIOS सिस्टम को प्रतिस्थापित करना चाहि

  1. - C# में इंटरफेस और इनहेरिटेंस

    इंटरफेसएक इंटरफेस को एक सिंटैक्टिकल कॉन्ट्रैक्ट के रूप में परिभाषित किया जाता है जिसे इंटरफेस इनहेरिट करने वाली सभी क्लासेस को फॉलो करना चाहिए। इंटरफेस सिंटैक्टिकल कॉन्ट्रैक्ट का क्या भाग परिभाषित करता है और डेराइविंग क्लासेस सिंटैक्टिकल कॉन्ट्रैक्ट का कैसे भाग परिभाषित करती हैं।आइए C# में इंटरफेस क

  1. - पायथन में 3 और 7 (रैखिक संयोजन)

    समस्या विवरण एक धनात्मक संख्या n दी गई है, जांचें कि क्या इसे 3 के गैर-ऋणात्मक गुणक और 7 के गैर-ऋणात्मक गुणक के योग के रूप में व्यक्त किया जा सकता है। उदाहरण इनपुट: 13 आउटपुट: True (क्योंकि 13 = 1×7 + 2×3) एल्गोरिदम i = 0 से n तक स्टेप 7 में: यदि (n - i) % 3 == 0: True False पायथन कार्