हाल ही में, मैंने कुछ अच्छा देखा।

#define container_of(ptr, type, member) ({                      \
const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
(type *)( (char *)__mptr - offsetof(type,member) );})

मूल रूप से, मुझे पता है कि यह मैक्रो क्या करता है। लेकिन एक बात है जो मुझे समझ नहीं आ रही है।

हम 0 को पॉइंटर टाइप (स्ट्रक्चर) में क्यों डाल सकते हैं और इसके सदस्य तक पहुंच सकते हैं? मेरे पास पहले से ही संदर्भित कुछ समान सामग्री है और 0 एक जैसा लगता है नल पॉइंटर। तो हम एक शून्य सूचक क्यों डाल सकते हैं और फिर उसके सदस्य तक पहुंच सकते हैं?

c gcc
2
Steven 3 फरवरी 2020, 16:17
3
मैं भाषा के वकीलों के लिए पूरा जवाब छोड़ दूंगा, लेकिन संक्षिप्त जवाब है: हम इसके सदस्य तक नहीं पहुंचते हैं। हम केवल उस सदस्य typeof को ही लेते हैं। यह एक कंपाइल-टाइम ऑपरेशन है जो रनटाइम पर कोई पॉइंटर डीरेफेरेंसिंग नहीं करता है।
 – 
Thomas
3 फरवरी 2020, 16:19
3
आप जिस शब्द की तलाश कर रहे हैं वह अमूल्यांकित संदर्भ है।
 – 
0x5453
3 फरवरी 2020, 16:20
1
इस लिंक की अच्छी व्याख्या है radek.io/2012/11/10/magical -कंटेनर_ऑफ़-मैक्रो
 – 
Karthick
3 फरवरी 2020, 16:24
3
BTW, मैक्रो के गैर-मानक भाग, जो एक प्रकार की जाँच की सुविधा प्रदान करते हैं, की भी आवश्यकता नहीं है। टाइपचेक पूरी तरह से मानक की सीमा के भीतर किया जा सकता है: ((type *)( (char *)(0? &(type){0}.member : (ptr)) - offsetof(type,member) ))
 – 
PSkocik
3 फरवरी 2020, 16:34

2 जवाब

सबसे बढ़िया उत्तर

typeof एक जीसीसी एक्सटेंशन है। इस ऑपरेटर का परिणाम एक प्रकार का नाम है।

यह काम करता है क्योंकि इसके ऑपरेंड का संकलन समय पर मूल्यांकन किया जाता है, इसलिए एक पॉइंटर को वास्तव में कुछ भी इंगित करने की आवश्यकता नहीं होती है। इस ऑपरेटर के लिए दस्तावेज़ कहता है:

typeof के ऑपरेंड का मूल्यांकन इसके दुष्प्रभावों के लिए किया जाता है यदि और केवल अगर यह परिवर्तनशील रूप से संशोधित प्रकार या ऐसे प्रकार के नाम की अभिव्यक्ति है।

चूंकि एक struct में एक चर लंबाई सरणी नहीं हो सकती है, यह गारंटी देता है कि typeof( ((type *)0)->member ) का मूल्यांकन रन टाइम पर नहीं किया जाएगा, इसलिए यह एक सुरक्षित संचालन है।

3
dbush 3 फरवरी 2020, 16:44

आपके द्वारा सूचीबद्ध कोड नमूने में, यह typeof के भीतर 0 कास्ट कर रहा है। लेकिन typeof एक फंक्शन नहीं है, यह एक ऑपरेटर है। आप इसके प्रकार तक पहुंच रहे हैं न कि इसके मूल्य तक।

इस प्रश्न का संदर्भ लें: टाइपऑफ़ नल "ऑब्जेक्ट" क्यों है?

0
Dan Eisenhut 3 फरवरी 2020, 16:27