C में फंक्शन पॉइंटर्स एक परिष्कृत अभी तक अत्यधिक व्यावहारिक विशेषता है जो डेवलपर्स को कॉलबैक तंत्र को लागू करने के लिए सशक्त बनाता है- अन्य कार्यों के लिए तर्कों के रूप में पारित कार्य और बाद में बुलाए गए, आमतौर पर घटनाओं या स्थितियों के जवाब में। यह तकनीक घटना संचालित प्रोग्रामिंग, पुस्तकालय डिजाइन और एपीआई विकास में मूलभूत है, लचीलापन और कोड का पुन: उपयोग प्रदान करती है। यह लेख कॉलबैक कार्यान्वयन पर ध्यान केंद्रित करने के साथ, बुनियादी ढांचे से उन्नत पैटर्न तक, गहराई में फंक्शन पॉइंटर्स की खोज करता है।

C में फंक्शन पॉइंटर्स को समझना

एक फंक्शन पॉइंटर एक ऐसा चर है जो किसी फंक्शन के मेमोरी एड्रेस को स्टोर करता है। नियमित पॉइंटर्स के विपरीत जो डेटा को इंगित करते हैं, फंक्शन पॉइंटर्स निष्पादन योग्य कोड को इंगित करते हैं। एक फंक्शन पॉइंटर को घोषित करने के लिए फ़ंक्शन के रिटर्न टाइप और पैरामीटर प्रकार को निर्दिष्ट करने की आवश्यकता होती है। उदाहरण के लिए:

int (*funcPtr)(int, int);

यह घोषणा करता है कि एक ऐसा कार्य के लिए एक सूचक के रूप में जो दो ] मानकों को स्वीकार करता है और एक लौटा देता है। के आसपास के पैरेंट्स आवश्यक हैं; उनके बिना, एक ऐसा कार्य घोषित करेगा जो एक सूचक को ] पर वापस ले आया। एक कार्य पता को सौंपना सीधा है:

int add(int a, int b) { return a + b; }
funcPtr = add; // or &add

सूचक के माध्यम से चालान समान रूप से सरल है:

int result = funcPtr(5, 3); // calls add(5, 3)

कार्य बिंदुओं को टाइप किया गया है: सूचक के हस्ताक्षर को निर्दिष्ट कार्य के हस्ताक्षर को बिल्कुल मिलान करना चाहिए।

कार्य सूचक के लिए आम उपयोग के मामले

  • Callback function – इस लेख का प्राथमिक ध्यान केंद्रित किया गया है।
  • राज्य मशीनें - कार्य बिंदुओं की तालिका संक्रमण को लागू करती है।
  • प्लगिन या ड्राइवर आर्किटेक्चर - कार्यों की गतिशील लोडिंग।
  • Comparator तर्क - मानक पुस्तकालय कार्यों में ] जैसे कि प्रयोग किया जाता है।
  • डिस्पैच टेबल - मेनू सिस्टम या कमांड अनुवादकों के लिए फंक्शन पॉइंटर्स की सरणी।

कार्य सूचकों के साथ कॉलबैक कार्यान्वित करना

एक कॉलबैक एक ऐसा कार्य है जिसका पता किसी अन्य कार्य में पारित हो जाता है, जिससे प्राप्त करने का कार्य उचित समय पर कॉलबैक को कॉल करने की अनुमति मिलती है। यह कार्यान्वयन विवरण से कॉलर को अलग करता है, मॉड्यूलर डिजाइन को बढ़ावा देता है। यहां एक क्लासिक उदाहरण है:

#include <stdio.h>

void executeOperation(int a, int b, int (*operation)(int, int)) {
 int result = operation(a, b);
 printf("Result: %d\n", result);
}

int add(int x, int y) { return x + y; }
int multiply(int x, int y) { return x * y; }

int main() {
 executeOperation(5, 3, add);
 executeOperation(5, 3, multiply);
 return 0;
}

यहाँ, ] एक समारोह सूचक को स्वीकार करता है और इसे ] और ]] के साथ बुलाता है। इस पैटर्न का बड़े पैमाने पर ग्राफिकल यूजर इंटरफेस (GUI) फ्रेमवर्क, अतुल्यकालिक I/O, और सिस्टम-लेवल इवेंट हैंडलिंग में उपयोग किया जाता है।

उपयोगकर्ता संदर्भ के साथ कॉलबैक

अक्सर कॉलबैक को निश्चित मापदंडों से परे अतिरिक्त डेटा की आवश्यकता होती है। एक आम तकनीक एक को कॉलबैक के संदर्भ में इंगित करने के लिए है:

typedef void (*Callback)(int event, void* context);

void registerCallback(Callback cb, void* ctx) {
 // store cb and ctx internally
 // later, invoke:
 cb(EVENT_TIMER, ctx);
}

void myEventHandler(int event, void* data) {
 int* value = (int*)data;
 printf("Event %d, value %d\n", event, *value);
}

int main() {
 int myData = 42;
 registerCallback(myEventHandler, &myData);
 return 0;
}

इस पैटर्न का उपयोग ग्लिब (GTK+) जैसे पुस्तकालयों में किया जाता है, जहां कॉलबैक उपयोगकर्ता डेटा को ] के माध्यम से ले जाते हैं।

क्लेरिटी और रखरखाव के लिए टाइपडिफ़

समारोह सूचक घोषणाओं unwieldy हो सकता है, विशेष रूप से जटिल हस्ताक्षर के साथ। का उपयोग करने से पठनीयता में सुधार होता है और रखरखाव को सरल बनाता है:

typedef int (*Operation)(int, int);

void execute(Operation op, int a, int b) {
 if (op) {
 printf("Result: %d\n", op(a, b));
 }
}

अब एक स्वच्छ प्रकार का नाम है। यह विशेष रूप से फायदेमंद है जब एकाधिक कॉलबैक कार्यों का उपयोग बड़े कोडबेस में किया जाता है।

सामान्य पिटफॉल और सर्वश्रेष्ठ अभ्यास

  • ]]Null-check invocation - हमेशा एक समारोह सूचक सत्यापित नहीं है [[FLT: 21]]]] यह uninitialized या गलत तरीके से साफ़ सूचक से दुर्घटनाओं को रोकता है।
  • ]Signature mismatches - एक गलत हस्ताक्षर के साथ एक समारोह गुजरने से अपरिभाषित व्यवहार होता है। ऐसी त्रुटियों को पकड़ने के लिए सक्षम कम्पाइलर चेतावनी (])।
  • Calling convention मतभेद - कुछ प्लेटफार्मों पर, विशेष रूप से जब अन्य भाषाओं के साथ C पुस्तकालयों मिश्रण, सम्मेलनों बुलाना होगा मिलान (जैसे, ]] Windows पर।
  • Thread safety[ - अगर एक कॉलबैक एकाधिक धागे से आह्वान किया जाता है, तो यह सुनिश्चित करें कि कॉलबैक कोड पुनः प्रवेश या ठीक से सिंक्रनाइज़ किया गया है।
  • ] संदर्भ सूचक का जीवनकाल [ - संदर्भ सूचक एक कॉलबैक के लिए पारित किया पूरी तरह से कॉलबैक के लिए मान्य रहना चाहिए। जब उचित हो तो स्थिर या हेप-अस्थित स्मृति का उपयोग करें।

उन्नत पैटर्न: फंक्शन पॉइंटर्स की सरणी

फंक्शन पॉइंटर्स को प्रेषण तालिका बनाने के लिए सरणी में संग्रहीत किया जा सकता है, जिससे स्वच्छ राज्य मशीनों या कमांड हैंडलर्स को सक्षम बनाया जा सकता है। उदाहरण के लिए, एक कैलकुलेटर जो एकाधिक संचालन का समर्थन करता है:

typedef int (*Operation)(int, int);

int add(int x, int y) { return x + y; }
int sub(int x, int y) { return x - y; }
int mul(int x, int y) { return x * y; }
int divide(int x, int y) { return y ? x / y : 0; }

Operation operations[] = { add, sub, mul, divide };
const char* opNames[] = {"add", "sub", "mul", "div"};

int main() {
 int a = 10, b = 2;
 for (int i = 0; i < 4; ++i) {
 printf("%s: %d\n", opNames[i], operations[i](a, b));
 }
 return 0;
}

यह पैटर्न एक्स्टेंसिबल है और लंबे समय तक ] या श्रृंखला से बचाता है।

अन्य भाषाओं के साथ तुलना

C++ जैसी भाषाएं फंक्शन पॉइंटर्स का उपयोग करती हैं लेकिन अधिक लचीलेपन के लिए फंकने वाले, लैम्ब्डा और की पेशकश भी करती हैं। हालांकि, C नींव बनी हुई है, और फंक्शन पॉइंटर्स को समझने के लिए ऑपरेटिंग सिस्टम API (जैसे, POSIX सिग्नल हैंडलर्स, ), एम्बेडेड सिस्टम और विरासत कोड के साथ काम करने के लिए आवश्यक है। C मानक पुस्तकालय स्वयं ] और ] में फंक्शन पॉइंटर्स का उपयोग करता है, जो उनके ubiquity का प्रदर्शन करता है।

प्रदर्शन विचार

फंक्शन पॉइंटर अप्रत्यक्षता में न्यूनतम ओवरहेड-आमतौर पर एक एकल सूचक अवक्षेप और एक अप्रत्यक्ष कॉल है। आधुनिक सीपीयू शाखा भविष्यवाणी के माध्यम से कुशलतापूर्वक अप्रत्यक्ष शाखाओं को संभालते हैं, लेकिन तंग लूप में अत्यधिक उपयोग मामूली मंदी का कारण बन सकता है। अधिकांश परिदृश्यों में, पठनीयता और रखरखाव क्षमता किसी भी प्रदर्शन लागत को दूर करती है। प्रोफ़ाइल अगर अनिश्चित है।

C में कॉलबैक के रियल-वर्ल्ड उदाहरण

  • ]Signal handlers]] ऑपरेटिंग सिस्टम संकेतों के लिए एक कॉलबैक रजिस्टर.
  • ]Thread function – एक कार्य सूचक और एक संदर्भ तर्क स्वीकार करता है।
  • ] कम स्तर के पुस्तकालयों में निकास छोरों - मुक्ति, लिबूव, और इसी तरह की घटना पुस्तकालयों में आई / ओ, टाइमर और संकेतों के लिए कॉलबैक का उपयोग किया जाता है।
  • ]]]Comparison function in सॉर्टिंग एल्गोरिदम - [[FLT::33]]] और ]]] C मानक पुस्तकालय से।
  • GUI टूलकिट [ – Gtk+ और EFL (Enlightenment Foundation Library) विजेट इवेंट हैंडलिंग के लिए व्यापक रूप से कॉलबैक का उपयोग करते हैं।

निष्कर्ष

फंक्शन पॉइंटर्स सी प्रोग्रामिंग का एक कोनेस्टोन है, जो कॉलबैक तंत्र को सक्षम करता है जो लचीलापन, मॉड्यूलरता और कोड का पुन: उपयोग प्रदान करता है। अपनी घोषणा को समझने के द्वारा, टाइपडिफ़ के साथ उपयोग और प्रेषण तालिकाओं जैसे उन्नत पैटर्न, आप मजबूत और रखरखाव योग्य सिस्टम डिजाइन कर सकते हैं। हमेशा सर्वोत्तम प्रथाओं का पालन करें: की जांच करें, हस्ताक्षर संगतता सुनिश्चित करें, संदर्भ जीवनकाल का प्रबंधन करें, और दस्तावेज़ कॉलबैक स्पष्ट रूप से। इन कौशलों के साथ, आप अपनी सी परियोजनाओं में कॉलबैक की पूरी शक्ति का उपयोग कर सकते हैं।

आगे पढ़ने के लिए, ]]C मानक दस्तावेज़ीकरण के लिए संकेत, और पता लगाएँ कि कैसे कार्य बिंदुओं का उपयोग GNUC पुस्तकालय मैनुअल]]]]. एक गहरी गोता घटना संचालित प्रोग्रामिंग में कॉलबैक के साथ पाया जा सकता है इस विकिपीडिया लेख घटना loops].