अच्छा ... सी में, यह किसी भी स्थान के लिए बहुत उपयोगी है जहां आपको डेटा संरचना का वर्णन करने के लिए कोड की आवश्यकता होती है। मैंने इसका इस्तेमाल किया है उदा। रन-टाइम-जेनरेट किए गए जीयूआई: विकल्प विकल्पों के लिए।
यह इस तरह काम करता है: विकल्प की आवश्यकता वाले कमांड को स्थानीय विकल्पों को अपने विकल्पों को धारण करने के लिए परिभाषित किया जाता है, और फिर उस संरचना को उस कोड में वर्णित करता है जो GUI उत्पन्न करता है, offsetof
का उपयोग करके यह इंगित करता है कि फ़ील्ड कहां हैं। पूर्ण पते के बजाय ऑफ़सेट का उपयोग करने से जीयूआई कोड संरचना के किसी भी उदाहरण के साथ काम करने की अनुमति देता है, केवल एक ही नहीं।
यह एक उदाहरण (मैंने कोशिश की) में जल्दी से स्केच करना मुश्किल है, लेकिन चूंकि टिप्पणियां इंगित करती हैं कि एक उदाहरण क्रम में है, मैं फिर कोशिश करूंगा।
मान लें कि हमारे पास "कमांड" नामक एक स्व-निहित मॉड्यूल है, जो एप्लिकेशन में कुछ क्रिया लागू करता है। इस कमांड में विकल्पों का एक समूह है जो अपने सामान्य व्यवहार को नियंत्रित करता है, जिसे ग्राफ़िकल यूजर इंटरफेस के माध्यम से उपयोगकर्ता के सामने उजागर किया जाना चाहिए। इस उदाहरण के प्रयोजनों के लिए, मान लें कि एप्लिकेशन एक फ़ाइल प्रबंधक है, और कमांड उदाहरण हो सकता है "कॉपी"।
विचार यह है कि प्रतिलिपि कोड एक सी फ़ाइल में रहता है, और जीयूआई कोड दूसरे में रहता है, और जीयूआई कोड को कॉपी कमांड के विकल्पों को "समर्थन" करने के लिए हार्ड-कोड करने की आवश्यकता नहीं होती है। इसके बजाय, हम तो जैसे, प्रतिलिपि फ़ाइल में विकल्पों को परिभाषित:
struct copy_options
{
unsigned int buffer_size; /* Number of bytes to read/write at a time. */
unsigned int copy_attributes; /* Attempt to copy attributes. */
/* more, omitted */
};
static struct copy_options options; /* Actual instance holding current values. */
फिर, प्रतिलिपि आदेश जीयूआई मॉड्यूल के साथ अपने विन्यास सेटिंग्स पंजीकृत करता है: तो फिर
void copy_register_options(GUIModule *gui)
{
gui_command_begin(gui, "Copy");
gui_command_add_unsigned_int(gui, "Buffer size", offsetof(struct copy_options, buffer_size));
gui_command_add_boolean(gui, "Copy attributes", offsetof(struct copy_options, copy_attributes));
gui_command_end(gui);
}
, मान लें कि उपयोगकर्ता के लिए पूछता जाने कॉपी कमांड के विकल्प सेट करें। हम तो पहले मौजूदा विकल्पों कॉपी कर सकते हैं, उन्हें रद्द करने का समर्थन करने के लिए, और संपादन इस आदेश के विकल्प के लिए एक संवाद पकड़े नियंत्रण के लिए जीयूआई मॉड्यूल, रन-टाइम में बनाया गया है, उपयुक्त से पूछते हैं:
void copy_configure(GUIModule *gui)
{
struct copy_options edit = options;
/* Assume this opens a modal dialog, showing proper controls for editing the
* named command's options, at the address provided. The function returns 1
* if the user clicked "OK", 0 if the operation was cancelled.
*/
if(gui_config_dialog(gui, "Copy", &edit))
{
/* GUI module changed values in here, make edit results new current. */
options = edit;
}
}
बेशक
, इस कोड को मान लिया गया है सेटिंग्स शुद्ध मूल्य-प्रकार होने के लिए, इसलिए हम सरल संरचना असाइनमेंट का उपयोग करके संरचना की प्रतिलिपि बना सकते हैं। अगर हम गतिशील तारों का भी समर्थन करते हैं, तो हमें प्रतिलिपि करने के लिए एक फ़ंक्शन की आवश्यकता होगी। कॉन्फ़िगरेशन डेटा के लिए हालांकि, स्ट्रिंग में किसी भी स्ट्रिंग को सांख्यिकीय रूप से आकार के char
सरणी के रूप में सबसे अच्छा व्यक्त किया जाएगा, जो ठीक होगा।
ध्यान दें कि जीयूआई मॉड्यूल केवल यह जानता है कि प्रत्येक मूल्य ऑफ़सेट के रूप में व्यक्त किए जाने वाले प्रत्येक मूल्य को एक अस्थायी ऑन-स्टैक प्रति के साथ संवाद कार्य प्रदान करने की अनुमति देता है। अगर हमने प्रत्येक क्षेत्र में प्रत्यक्ष पॉइंटर्स के साथ जीयूआई मॉड्यूल स्थापित किया था, तो यह संभव नहीं होगा जो बहुत कम लचीला होगा।
आपका पहला उपयोग सी में वैध है, लेकिन सी ++ पॉइंटर्स-टू-सदस्य में बहुत अधिक आवश्यकता को हटा दें। –
यहां इसके बारे में कुछ अन्य प्रश्न है: http://stackoverflow.com/questions/400116/what-is-the-purpose-and-return-type-of-the-builtinoffsetof-operator –