यहां एक प्रासंगिक उदाहरण है। यह स्पष्ट रूप से मान्य नहीं है सी, लेकिन मैं सिर्फ प्रीप्रोसेसर से निपट रहा हूं, इसलिए कोड को वास्तव में संकलित नहीं करना है।सी मैक्रो विस्तार के दौरान, मैक्रोज़ के लिए एक विशेष मामला है जो "/ *" तक विस्तारित होगा?
#define IDENTITY(x) x
#define PREPEND_ASTERISK(x) *x
#define PREPEND_SLASH(x) /x
IDENTITY(literal)
PREPEND_ASTERISK(literal)
PREPEND_SLASH(literal)
IDENTITY(*pointer)
PREPEND_ASTERISK(*pointer)
PREPEND_SLASH(*pointer)
उस पर जीसीसी के पूर्वप्रक्रमक चल रहा है:
gcc -std=c99 -E macrotest.c
यह पैदावार:
(...)
literal
*literal
/literal
*pointer
**pointer
/*pointer
अंतिम पंक्ति में अतिरिक्त जगह कृपया ध्यान दें।
यह मैक्रोज़ को "/ *" तक विस्तार से रोकने के लिए एक सुविधा की तरह दिखता है, जो मुझे यकीन है कि अच्छी तरह से इरादा है। लेकिन एक नज़र में, मुझे सी 99 मानक में इस व्यवहार से संबंधित कुछ भी नहीं मिला। फिर फिर, मैं सी पर अनुभवहीन हूं। क्या कोई इस पर कुछ प्रकाश डाला सकता है? यह निर्दिष्ट कहां है? मुझे लगता है कि सी 99 का पालन करने वाला एक कंपाइलर केवल मैक्रो विस्तार के दौरान अतिरिक्त रिक्त स्थान नहीं डालना चाहिए क्योंकि यह शायद प्रोग्रामिंग गलतियों को रोक देगा।
+1। मुझे लगता है कि मुख्य अंतर्दृष्टि यह है कि -ई वास्तव में मानक द्वारा निर्दिष्ट नहीं है।प्रोग्राम के बारे में मानक वार्ता प्रीप्रोकैसिंग टोकन के अनुक्रम से मिलती है, और उसके बाद इसे टोकन के अनुक्रम में परिवर्तित कर दिया जाता है। यह प्रीप्रोसेसर तक पूरी तरह से उन अनुक्रमों का प्रतिनिधित्व करने के लिए है, और इस मामले में उन्हें * बाइट्स * के अनुक्रम के रूप में फ़ाइल में क्रमबद्ध करने के लिए कैसे करें। निस्संदेह एकमात्र व्यवहार्य क्रमिकरण एक है जिसे प्रीप्रोकैसिंग टोकन की समतुल्य श्रृंखला के रूप में पढ़ा जाएगा, जैसा कि आप कहते हैं, इसे दो टोकन के बीच सफेद जगह डालना होगा जो एक साथ बन जाएगा। –
मैं 100% सहमत हूं, आपकी व्याख्या की तरह कुछ लिखना चाहता था लेकिन समय नहीं लगा था। –
अच्छा जवाब, हालांकि मेरे पास दो नाटकीय टिप्पणियां हैं: '/ *' टोकन जैसी कोई चीज़ नहीं है; टोकननाइज्ड होने से पहले स्रोत से टिप्पणी हटा दी जाती है। आप '##' का उपयोग करके दो '+' टोकन से '++' टोकन बना सकते हैं। –