शून्य में && का क्या अर्थ है * p = && abc;


102

मुझे एक कोड आया void *p = &&abc;। का क्या महत्व है&&यहाँ ? मैं संदर्भ के संदर्भों के बारे में जानता हूं, लेकिन मुझे लगता &&है कि इस संदर्भ में उपयोग अलग है। क्या &&इंगित करता है void *p = &&abc;?


14
अपने इसे कहां देखा था?
user541686

3
मैं यह भी जानना चाहूँगा कि आपने यह कहाँ देखा है।
फ्लावियस

जवाबों:


154

&&वर्तमान फ़ंक्शन में परिभाषित लेबल का पता प्राप्त करने के लिए gcc का विस्तार है।

void *p = &&abc मानक C99 और C ++ में अवैध है।

इस ग्राम के साथ संकलित ++।


42
अब कल्पना करें कि यदि डिफ़ॉल्ट रूप से gcc-upantic हो तो सभी को कितना बेहतर प्रोग्रामर मिलेगा। तब लोग ग्नूस के बारे में अप्रासंगिक जानकारी के बजाय सी सीखेंगे।
लुंडिन

4
क्या हैक है। यदि वे लेबल पॉइंटर्स के लिए एक नया सिंटैक्स का आविष्कार करते हैं, तो उन्हें उपयोग करने के बजाय इसके लिए एक नए प्रकार का आविष्कार करना चाहिए void*
मार्क रैनसम

1
@Prasoon सौरव: जिसने भी नीचा दिखाया है वह शायद इस सुविधा को अस्वीकार कर रहा है और इसे आप पर निकाल रहा है।
चक

@ लुंडिन: एक ही सबसे संकलक के बारे में कहा जा सकता है। __forceinline? __declspec(naked)? मेरा पसंदीदा MSVCism में से एक है: template<typename T> class X { friend T; }जो अमान्य है C ++ 03।
सेबस्टियन मच

दूसरा लिंक मर चुका है।
कूर

96

इसका पता कैसे लगाया जाए

यह एक लेबल का पता है और यह जीसीसी के लिए विशिष्ट है ।

int main(void) {
    void* startp;
s:
    startp = &&s;
    printf("the assignment above starts at address %p\n", startp);
    return 0;
}

आप इसे परीक्षण द्वारा स्वयं समझ सकते हैं:

int main(void) {
    void* startp;
    int a;
    startp = &&a;
    printf("startp=%p\n", startp);
    return 0;
}

किस मामले में जीसीसी का कहना है:

त्रुटि: लेबल 'a' का उपयोग किया गया है लेकिन परिभाषित नहीं है

हुड के नीचे - विधानसभा

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

OS के बाद डिस्क से .exe फ़ाइल लोड होने पर, ऑपरेटिंग सिस्टम के एक घटक को "लोडर" कहा जाता है (विंडोज़ में "PE लोडर" है, लिनक्स में "ELF लोडर" या शायद अन्य लोग भी हैं, यदि वे इसमें संकलित हैं कर्नेल), यह उस प्रोग्राम के "वर्चुअलाइजेशन" को एक प्रक्रिया में बदल देता है।

इस प्रक्रिया को लगता है कि यह रैम में एकमात्र है और इसकी पूरी रैम तक पहुंच है (यानी, 32-बिट मशीन पर 0x00000000-0xFFFFFFFF)।

(ऊपर क्या हो रहा है की एक छोटी overwiew है, आप वास्तव में यह पूरी तरह से समझने के लिए विधानसभा सीखने की जरूरत है, तो मेरे साथ सहन)

अब, स्रोत कोड में लेबल मूल रूप से एक पता है। "गोटो लेबल?" उस पते पर कूदने के अलावा और कुछ नहीं करता ( विधानसभा में निर्देश सूचक के बारे में सोचें )। यह लेबल इस RAM पते को संग्रहीत करता है, और इस तरह आप उस पते का पता लगा सकते हैं।

ASM सीख लेने के बाद, आपको पता चलेगा कि वह पता .textनिष्पादन योग्य अनुभाग के भीतर एक निर्देश को इंगित करता है । .textखंड एक जो निष्पादित करने के लिए आप इस कार्यक्रम के (बाइनरी) कोड रखती है।

आप इसके साथ निरीक्षण कर सकते हैं:

objdump -x a.out

एक व्यावहारिक उदाहरण

जैसा कि जीसीसी में वर्णित है , आप इसका उपयोग जंप टेबल को इनिशियलाइज़ करने के लिए कर सकते हैं। कुछ स्कैनर जनरेटर जैसे कि re2c ( -gपैरामीटर देखें ) का उपयोग करें जो अधिक कॉम्पैक्ट स्कैनर उत्पन्न करता है। हो सकता है कि समान तकनीक को नियोजित करने वाला पार्सर जनरेटर भी हो ।


4
संकलन के साथ -std = c99-upantic।
लुंडिन

2
यह उल्लेख करने के लिए बहुत महत्वपूर्ण है कि यह एक जीसीसी एक्सटेंशन है, और न ही तेह भाषा का एक मुख्य हिस्सा है
जाल्फ

1
यह बहुत प्रभावशाली Flavius ​​है।
ऑक्टेवियन ए। डामियन

1
मुझे इस तरह का उत्तर पसंद है, अधिक लोगों को यह सिखाने की आवश्यकता है कि केवल बताए जाने के बजाय उत्तर कैसे ढूंढें।
लेट्सएटलचंच

1
गहराई से स्पष्टीकरण के लिए धन्यवाद। विधानसभा से संबंधित विश्लेषण की सराहना की।
CZZ 15'13
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.