2012-09-03 20 views
10

नीचे संरचना की परिभाषा पर, मैक्रो परिभाषा (#define) वाली एक पंक्ति है। वह रेखा वास्तव में क्या करती है? मैं समझता हूं कि यह सरणी h_addr_list की पहली प्रविष्टि के लिए उपनाम बनाता है, लेकिन यह अभी भी मेरे लिए अजीब लग रहा है। h_addr संरचना hostent का सदस्य है? क्या यह परिभाषा केवल संरचना के दायरे में है?स्ट्रक्चर परिभाषा के अंदर मैक्रो को परिभाषित करना

struct hostent 
{ 
    char *h_name;  /* official name of host */ 
    char **h_aliases; /* alias list */ 
    int  h_addrtype;  /* host address type */ 
    int  h_length;  /* length of address */ 
    char **h_addr_list; /* list of addresses from name server */ 
    #define h_addr h_addr_list[0] /* address, for backward compatiblity */ 
}; 

उत्तर

16

मैक्रो परिभाषा बिल्कुल स्कॉप्ड नहीं है, यह उसी तरह काम करेगी अगर इसे उस संरचना के बाहर परिभाषित किया गया हो।

यह पुराने कोड के बजाय hr.h_addr का उपयोग कर he.h_addr_list[0] में परिवर्तित करने (यह मानते हुए he एक struct hostent है) करना जारी रखने के लिए अनुमति देता है।

स्पष्टीकरण के लिए, h_addrstruct hostent का क्षेत्र नहीं है। उस परिभाषा को प्री-प्रोसेसर द्वारा संसाधित किया जाता है, वास्तविक कंपाइलर एक खाली रेखा देखता है जहां #define है।
लेकिन अगर कोड का एक टुकड़ा he.h_addr के रूप में लिखा गया है, तो प्री-प्रोसेसर इसे संशोधित करेगा और इसे he.h_addr_list[0] के साथ प्रतिस्थापित करेगा। यही वास्तविक संकलक देखेंगे।

प्री-प्रोसेसर मैक्रोज़ कभी भी स्कॉप्ड नहीं होते हैं: संकलक उचित रूप से उन्हें नहीं देखता है - यह केवल प्रतिस्थापन का परिणाम देखता है, और प्री-प्रोसेसर पूरी तरह से स्कॉइंग करने से अनदेखा करता है (इसके बारे में पता नहीं है)।

+0

मैं आपकी प्रतिक्रिया केवल आंशिक रूप से समझता हूं। उदाहरण के लिए, 'h_addr' तब' स्ट्रक्चर होस्टेंट 'का सदस्य क्यों होता है जब यह केवल एक मैक्रो होता है? – pap42

+2

'h_addr' 'संरचना होस्टेंट' का क्षेत्र नहीं है। उस परिभाषा को प्री-प्रोसेसर द्वारा संसाधित किया जाता है, वास्तविक कंपाइलर एक खाली रेखा देखता है जहां '# परिभाषित' होता है। लेकिन अगर कोड का एक टुकड़ा 'he.h_addr' के रूप में लिखा गया है, तो प्री-प्रोसेसर इसे संशोधित करेगा और इसे' he.h_addr_list [0] 'से बदल देगा। यही वास्तविक संकलक देखेंगे। – Mat

+0

आपकी प्रतिक्रिया उत्कृष्ट है, लेकिन मुझे लगता है कि आपको इसे भविष्य के पाठकों के लिए थोड़ा और स्पष्ट बनाने के लिए संपादित करना चाहिए (शायद आपने जो टिप्पणी अभी बनाई है?)। – pap42

5

एक बार परिभाषित होने के बाद, एक मैक्रो पहचानकर्ता सी स्कॉइंग नियमों से स्वतंत्र रूप से दिखाई देता है। इसका दायरा अनुवाद इकाई के अंत तक या संबंधित #undef निर्देश के अंत तक इसकी परिभाषा से शुरू होता है।

यहां, संरचना के अंदर परिभाषा सिर्फ पढ़ने योग्यता के लिए है; उदाहरण के लिए आप अपनी संरचना के बाद अपने मैक्रो को भी परिभाषित कर सकते हैं:

struct hostent 
{ 
    char *h_name; 
    char **h_aliases; 
    int h_addrtype; 
    int h_length; 
    char **h_addr_list; 
}; 

#define h_addr h_addr_list[0] 

यह बिल्कुल एक क्षेत्र नहीं है; यह उपयोगकर्ता को s.h_addr_list[0] के बजाय s.h_addr लिखने की अनुमति देता है।

0

मैक्रो परिभाषाओं को स्कॉप्ड नहीं किया गया है, इसलिए यह मैक्रो संकलन इकाइयों के भीतर दिखाई दे रहा है जो इस परिभाषा को देखते हैं और undef h_addr तक।

संबंधित मुद्दे