जीसीसी के कोण-कोष्ठक के कार्यान्वयन में शामिल हैं। इसका वर्णन नीचे क्यों किया गया है?


11

इसके खंड 2.6 में शामिल इस दस्तावेज में निम्नलिखित अनुच्छेद हैं:

यदि रेखा एक टोकन स्ट्रीम से शुरू होती है, जिसमें <टोकन शामिल है और एक> टोकन शामिल है, तो फ़ाइल नाम बनाने के लिए <और पहले> के बीच के टोकन संयुक्त हैं। टोकन के बीच कोई भी व्हाट्सएप एक ही स्थान पर कम हो जाता है; प्रारंभिक <के बाद किसी भी स्थान को बरकरार रखा जाता है, लेकिन समापन से पहले एक अनुगामी स्थान> को अनदेखा किया जाता है । सीपीपी कोण-ब्रैकेट के नियमों के अनुसार फ़ाइल की खोज करता है।

मुझे पता है कि यह कार्यान्वयन परिभाषित है, लेकिन जीसीसी के लिए ऐसा क्यों होना चाहिए? मैं विशेष रूप से ऊपर उल्लिखित वाक्य का उल्लेख कर रहा हूं।

संपादित करें

मैंने अभी देखा है कि ऊपर दिए गए उद्धरण के पहले तीसरा पैराग्राफ निम्नलिखित कहता है:

मैक्रो को परिभाषित करते समय आपको सावधान रहना चाहिए। #defineपाठ सहेजता है, टोकन नहीं। प्रीप्रोसेसर के पास यह जानने का कोई तरीका नहीं है कि मैक्रो का उपयोग तर्क के रूप में किया जाएगा #include, इसलिए यह साधारण टोकन बनाता है, हेडर नाम नहीं। यदि आप दोहरे-उद्धरण का उपयोग करते हैं, तो यह समस्या पैदा करने की संभावना नहीं है, जो स्ट्रिंग स्थिरांक के काफी करीब हैं। यदि आप कोण कोष्ठक का उपयोग करते हैं, हालांकि, आपको परेशानी हो सकती है

क्या किसी को पता है कि यहां किस तरह की परेशानी बताई जा रही है?


6
सबसे अच्छा अनुमान है कि जीसीसी के डेवलपर्स को लगता है कि फ़ाइल नाम के अंत में रिक्त स्थान होना एक घृणा है।
user3386109

1
अग्रणी और / या अनुगामी रिक्त स्थान वाले फ़ाइलनाम विशेष रूप से विंडोज पर wok के साथ बहुत ही बारीक हैं।
रेमी लेबू

1
सिर्फ इसलिए कि इसे इस तरह परिभाषित किया गया है, जरूरी नहीं कि इसका मतलब यह है कि इसे उसी तरह परिभाषित किया जाना चाहिए। यह मानक द्वारा अनिवार्य नहीं है।
एरोरिका

विज़ुअल स्टूडियो प्रारंभिक और समाप्ति दोनों को हटाता है, इसलिए अलग तरह से व्यवहार करता है। HP aCC (जैसे अनुकूलता कारणों के लिए) gcc की तरह व्यवहार करता है।
स्लिमक

कभी-कभी दस्तावेज़ीकरण केवल यह बताता है कि कोड क्या होता है इसके बजाय अन्य तरीकों के बजाय, विशेष रूप से ऐसे मामलों में जो कोई फर्क नहीं पड़ता (यदि आप दोहरे उद्धरण चिह्नों का उपयोग करते हैं तो आप कहीं भी किसी भी स्थान का उपयोग कर सकते हैं)।
रस्टीक्स

जवाबों:


8

मुझे लगता है कि कार्यान्वयनकर्ता ने इस कार्यक्षमता को लागू करने के लिए सबसे सरल तरीका चुना, बिना ज्यादा विचार किए।

ऐसा लगता है कि प्रारंभिक कार्यान्वयन 2000-07-03 (दो दशक पहले!) में उतरा। प्रासंगिक हिस्सा जैसा दिखता है ( स्रोत ):

  for (;;)
    {
      t = cpp_get_token (pfile);
      if (t->type == CPP_GREATER || t->type == CPP_EOF)
        break;

      CPP_RESERVE (pfile, TOKEN_LEN (t));
      if (t->flags & PREV_WHITE)
        CPP_PUTC_Q (pfile, ' ');
      pfile->limit = spell_token (pfile, t, pfile->limit);
    }

उल्लेखनीय रूप से, यह तब टूटता है जब यह CPP_GREATERटोकन (यानी >) को देखता है, टोकन के लिए मेमोरी को संग्रहीत करने से पहले । यह समझ में आता है, क्योंकि टोकन को बफ़र पर नहीं लिखा जाने पर मेमोरी आवंटित करने की कोई आवश्यकता नहीं है।

फिर, केवल मेमोरी के आरक्षित होने के बाद , प्रीप्रोसेसर यह जांचता है कि क्या टोकन से पहले व्हॉट्सएप ( t->flags & PREV_WHITE) है और जब ऐसा होता है, तो बफर को एक व्हाट्सएप चरित्र लिखता है।

नतीजतन, में < foo / bar >, केवल पहले व्हाट्सएप foo(जो कि प्रारंभिक के बाद है <) /, और barरखा जाता है।


शानदार, शानदार जवाब। यह पहली बार है जब मुझे GCC में कोड का एक टुकड़ा देखने का अवसर मिला है। इसके लिए शुक्रिया।
अयरोसा

लेकिन क्या यह मामला नहीं है कि if (t->flags & PREV_WHITE) CPP_PUTC_Q (pfile, ' ');दस्तावेज़ में जो कहा जा रहा है उसके विपरीत है: "टोकन के बीच कोई भी व्हाट्सएप एक एकल स्थान पर कम हो गया है? ..."
अयरोसा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.